剑指offer:3-7记录 ╰+攻爆jí腚メ 2023-07-12 14:16 1阅读 0赞 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1: 输入: \[2, 3, 1, 0, 2, 5, 3\] 输出:2 或 3 思路:一个set记录即可。 class Solution { public int findRepeatNumber(int[] nums) { Set<Integer> set = new HashSet<Integer>(); for (int num : nums) { if (!set.add(num)) { return num; } } return -1; } } -------------------- 在一个 n \* m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例: 现有矩阵 matrix 如下: \[ \[1, 4, 7, 11, 15\], \[2, 5, 8, 12, 19\], \[3, 6, 9, 16, 22\], \[10, 13, 14, 17, 24\], \[18, 21, 23, 26, 30\] \] 给定 target = 5,返回 true。 给定 target = 20,返回 false。 限制: 0 <= n <= 1000 0 <= m <= 1000 思路:从左下角或右上角查,每次可以排除一行或一列。 class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return false; } int len = matrix.length; int row = 0, column = matrix[0].length - 1; while (row < len && column >= 0) { int num = matrix[row][column]; if (num == target) { return true; } else if (num > target) { column--; } else { row++; } } return false; } } -------------------- 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示例 1: 输入:s = "We are happy." 输出:"We%20are%20happy." 思路:从后往前填,未填的数不会被覆盖,每个字母只需赋值一次。(否则从前往后替换要不断地移动后面的字符) class Solution { public String replaceSpace(String s) { int length = s.length(); char[] array = new char[length * 3]; int size = 0; for (int i = 0; i < length; i++) { char c = s.charAt(i); if (c == ' ') { array[size++] = '%'; array[size++] = '2'; array[size++] = '0'; } else { array[size++] = c; } } String newStr = new String(array, 0, size); return newStr; } } -------------------- 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1: 输入:head = \[1,3,2\] 输出:\[2,3,1\] 限制: 0 <= 链表长度 <= 10000 思路:放栈里倒出来即可。 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public int[] reversePrint(ListNode head) { Stack<ListNode> stack = new Stack<ListNode>(); while (head != null) { stack.push(head); head = head.next; } int size = stack.size(); int[] arr = new int[size]; for (int i = 0; i < size; i++) { arr[i] = stack.pop().val; } return arr; } } -------------------- 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder = \[3,9,20,15,7\] 中序遍历 inorder = \[9,3,15,20,7\] 返回如下的二叉树: 3 / \\ 9 20 / \\ 15 7 限制: 0 <= 节点个数 <= 5000 思路: 1、先序序列的第一个元素是根 2、找到根在中序序列中的位置 3、重复以上过程。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { int n = preorder.length; if (n == 0) return null; int rootVal = preorder[0], rootIndex = 0; for (int i = 0; i < n; i++) { if (inorder[i] == rootVal) { rootIndex = i; break; } } TreeNode root = new TreeNode(rootVal); root.left = buildTree(Arrays.copyOfRange(preorder, 1, 1 + rootIndex), Arrays.copyOfRange(inorder, 0, rootIndex)); root.right = buildTree(Arrays.copyOfRange(preorder, 1 + rootIndex, n), Arrays.copyOfRange(inorder, rootIndex + 1, n)); return root; } }
还没有评论,来说两句吧...