【Notes12】剑指offer_03-20题
发布日期:2021-04-30 21:06:43 浏览次数:91 分类:精选文章

本文共 3235 字,大约阅读时间需要 10 分钟。

数组重复数字

问题描述:在数组中找出重复的数字。

解决思路:使用哈希集合来记录已出现的数字,遍历数组一旦发现重复的数字即可返回。

代码实现

public int findRepeatNumber(int[] nums) {    HashSet
set = new HashSet<>(); int res = -1; for (int num : nums) { if (!set.add(num)) { res = num; break; } } return res;}

二维数组查找

问题描述:判断目标数字是否存在于二维数组中。

解决思路:采用类似二分查找的方法,从右上角开始,逐步排除行或列,直到找到目标或遍历完整个数组。

代码实现

public boolean findNumberIn2DArray(int[][] array, int target) {    if ((array == null || array.length == 0) ||         (array.length == 1 && array[0].length == 0)) {        return false;    }    int i = 0, j = array[0].length - 1;    while (i <= array.length - 1 && j >= 0) {        if (array[i][j] == target) return true;        if (array[i][j] > target) j--;        else i++;    }    return false;}

替换空格

问题描述:将字符串中的空格替换为"%20"。

解决思路:遍历字符串,将每个空格替换为特定的字符序列。

代码实现

public String replaceSpace(String s) {    int n = s.length();    char[] array = new char[3 * n];    int size = 0;    for (int i = 0; i < n; i++) {        char c = s.charAt(i);        if (c == ' ') {            array[size++] = '%';            array[size++] = '2';            array[size++] = '0';        } else {            array[size++] = c;        }    }    return new String(array, 0, size);}

链表反转打印

问题描述:从尾到头打印链表节点的值。

解决思路:使用栈来辅助反转链表,然后将节点值依次弹出栈,存入结果数组。

代码实现

public int[] reversePrint(ListNode head) {    Stack
stk = new Stack<>(); ListNode temp = head; while (temp != null) { stk.push(temp); temp = temp.next; } int n = stk.size(); int[] res = new int[n]; for (int i = 0; i < n; i++) { res[i] = stk.pop().val; } return res;}

二叉树重建

问题描述:根据前序和中序遍历序列重建二叉树。

解决思路:使用递归的深度优先搜索(DFS)方法,记录前序遍历的索引和中序遍历的索引,逐步构建树。

代码实现

public TreeNode buildTree(int[] preorder, int[] inorder) {    return dfs(preorder, inorder, null);}private TreeNode dfs(int[] preorder, int[] inorder, TreeNode finish) {    if (preindex == preorder.length || (finish != null && inorder[inindex] == finish.val)) {        return null;    }    TreeNode root = new TreeNode(preorder[preindex++]);    root.left = dfs(preorder, inorder, root);    inindex++;    root.right = dfs(preorder, inorder, finish);    return root;}

下一个节点查找

问题描述:在二叉树中找到某个节点的下一个节点。

解决思路:沿着右子树走,直到找到一个有左子树的节点,或者回到父节点继续查找。

代码实现

public TreeNode inorderSuccessor(TreeNode p) {    if (p.right != null) {        p = p.right;        while (p.left != null) {            p = p.left;        }        return p;    }    while (p.father != null) {        if (p == p.father.left) {            return p.father;        }        p = p.father;    }    return null;}

队列实现

问题描述:用两个栈实现队列。

解决思路:利用两个栈来模拟队列的先进先出的特性,将元素从一个栈转移到另一个栈中。

代码实现

public class CQueue {    Stack
stk1, stk2; int size; public CQueue() { stk1 = new Stack<>(); stk2 = new Stack<>(); size = 0; } public void appendTail(int value) { while (!stk1.isEmpty()) { stk2.push(stk1.pop()); } stk1.push(value); while (!stk2.isEmpty()) { stk1.push(stk2.pop()); } size++; } public int deleteHead() { if (size == 0) return -1; int res = stk1.pop(); size--; return res; }}

剩余题目(其他问题请根据上述格式补充)

...


以上代码均为简化版,具体实现细节可根据实际需求进一步优化。

上一篇:Java--PATH环境变量
下一篇:Java语言的特性

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2026年06月01日 00时30分31秒