剑指offer-3-10

这篇具有很好参考价值的文章主要介绍了剑指offer-3-10。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

3.数组中的重复数字

剑指offer-3-10,力扣刷题专项,算法
1.用set

 HashSet set1=new HashSet();
       for(int i=0;i<array.length;i++){
           if(set1.contains(array[i])){
               System.out.println(array[i]);
               break;
           }else{
               set1.add(array[i]);
           }

       }

2.用一个数组代替哈希表

	   int []array={2,3,1,0,2,5,3};
       int []hasharray=new int[array.length];
       for(int i=0;i<array.length;i++){
           if(hasharray[array[i]]>0){
               System.out.println(array[i]);
               break;
           }else{
               hasharray[array[i]]++; }
       }

4.二维数组中的查找

剑指offer-3-10,力扣刷题专项,算法
1.从右上角查找
2.查找的范围是从左下角到目前节点的小矩形,注意边界问题

public class LC04 {
    public static void main(String[] args) {
        int 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}};
        boolean ans= findNumberIn2DArray(matrix,50);
        System.out.println(ans);
    }
    public static boolean findNumberIn2DArray(int[][] matrix, int target) {
        int row=matrix.length;
        int column=matrix[0].length;
        int temp=matrix[0][column-1];  //右上角的元素
        int i=0,j=column-1;
        while(i<row&&j>=0){  //判断不越界
            if(matrix[i][j]==target){
                return true;
            }
            if(matrix[i][j]>target){
                j--;
                
            }else{
                i++;
            }
        }
        return false;
    }
}

5.替换空格

剑指offer-3-10,力扣刷题专项,算法

public class Solution {
    public static String replaceSpace(String s) {
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<s.length();i++){
            char c1=s.charAt(i);
            //if(" ".equals(c1)){
            if(c1==' '){
                sb.append("%20");
            }else{
                sb.append(s.charAt(i));
            }
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        //String s1=replaceSpace("We are happy.");
        String s1="We are happy";
        String s2=s1.replace(" ","%20");
        System.out.println(s2);
    }
}

针对于" “.equals(c1)判定失败的问题:
System.out.println(” “.equals(” “)); //true
System.out.println(” ".equals(’ ')); //false
因为c1是字符,所以不行。

replace和replaceAll是JAVA中常用的替换字符的方法

public String replace(char oldChar, char newChar) 在字符串中用newChar字符替代oldChar字符,返回一个新的字符串
public String replaceAll(String regex,String replacement)使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的每个子字符串。
区别:

1)replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串);

2)replaceAll的参数是regex,即基于正则表达式的替换,比如,可以通过replaceAll(“\d”, “*”)把一个字符串所有的数字字符都换成星号;

相同点:

都是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或字符串,如果只想替换第一次出现的,可以使用replaceFirst(),这个方法也是基于规则表达式的替换,但与replaceAll()不同的是,只替换第一次出现的字符串;

另外,如果replaceAll()和replaceFirst()所用的参数据不是基于规则表达式的,则与replace()替换字符串的效果是一样的,即这两者也支持字符串的操作;

还有一点注意::执行了替换操作后,源字符串的内容是没有发生改变的。

6.从尾到头打印链表

剑指offer-3-10,力扣刷题专项,算法
因为是反向的输出,所以用栈。递归也可以

public class LC06 {
    public static class ListNode {
        int val;
        ListNode next;
        ListNode(int x) {
            val = x;
        }
    }
    public static int[] reversePrint(ListNode head) {
        LinkedList<Integer> stack=new LinkedList<Integer>();
        while(head!=null){
            stack.addLast(head.val);
            stack.add(head.val);
            head=head.next;
        }
        int []ans=new int[stack.size()];
        for(int i=0;i<ans.length;i++){
            ans[i]=stack.removeLast();
        }
        return ans;
    }
    public static void main(String[] args) {
        ListNode node1=new ListNode(1);
        ListNode node2=new ListNode(2);
        ListNode node3=new ListNode(3);
        node1.next=node2;
        node2.next=node3;
        int[] a=reversePrint(node1);
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }
}

7.重建二叉树(⭐)

剑指offer-3-10,力扣刷题专项,算法

         ~~~~~~~~          1
     ~~~~      2      ~~~~      3
4    ~~    5    ~~    6    ~~    7
前序 1 2 4 5 3 6 7
中序 4 2 5 1 6 3 7

public class LC07 {
    public static class TreeNode{
        int val;
        TreeNode leftNode;
        TreeNode rightNode;
        TreeNode(int val){
            this.val=val;
        }
    }
    static HashMap<Integer, Integer>  map = new HashMap<>();//标记中序遍历
    static int []preorder;

    public static TreeNode buildTree(int[] preorder, int[] inorder) {
        LC07.preorder =preorder;
        for (int i = 0; i < inorder.length; i++) {
        //中序数组的值  -> 值在中序数组中的位置
            map.put(inorder[i], i);
        }
        //三个索引分别为
        //当前根的的索引
        //递归树的左边界,即数组左边界
        //递归树的右边界,即数组右边界
        return recur(0,0,preorder.length-1);
    }
    
    static TreeNode recur(int pre_root, int in_left, int in_right){
        if(in_left > in_right) return null;// 相等的话就是自己
        TreeNode root = new TreeNode(preorder[pre_root]);//获取root节点
        int idx = map.get(preorder[pre_root]); //获取在中序遍历中根节点所在索引,以方便获取左子树的数量
        root.leftNode=recur(pre_root+1,in_left,idx-1);
        //右子树的根的索引为先序中的 当前根位置 + 左子树的数量 + 1
        root.rightNode=recur(pre_root+idx-in_left+1,idx+1,in_right);
        return root;
    }

    public static void main(String[] args) {
        int[] preorder={3,9,20,15,7};
        int[] inorder={9,3,15,20,7};
        TreeNode node1=buildTree(preorder,inorder);
        bfs(node1);
    }
    public static void bfs(TreeNode node){
        if(node!=null){
            System.out.println(node.val);
            bfs(node.leftNode);
            bfs(node.rightNode);
        }
    }
    
}

8.用两个栈实现队列

剑指offer-3-10,力扣刷题专项,算法
如果出队列里有值,直接出值。出队列里没值了,再把入队列里的东西全塞进出队列里。

public class LC09 {
    static class CQueue {
        Stack<Integer> A,B;

        public CQueue() {
            A=new Stack<>();
            B=new Stack<>();
        }

        public void appendTail(int value) {
            A.add(value);

        }

        public int deleteHead() {
            if(!B.isEmpty()){
                return B.pop();
            }
            if(A.isEmpty()) return -1;
            while(!A.isEmpty()){
                B.push(A.pop());
            }
            return B.pop();

        }
    }

    public static void main(String[] args) {
        CQueue q1=new CQueue();
        q1.appendTail(3);
        System.out.println(q1.deleteHead());
        System.out.println(q1.deleteHead());
        System.out.println(q1.deleteHead());
    }
}

10.青蛙跳台阶

剑指offer-3-10,力扣刷题专项,算法文章来源地址https://www.toymoban.com/news/detail-623327.html

public class LC10 {
    public static int numWays(int n) {
         if(n==0 || n==1) return 1;
         int a=1,b=2;
         int temp=2;
         int ans1=b;
         while(temp<n){
             ans1=(a+b)%1000000007;
             a=b;
             b=ans1;
             temp++;
         }
         return ans1;
    }
    public static void main(String[] args) {
        System.out.println(numWays(7));
    }
}

到了这里,关于剑指offer-3-10的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 力扣刷题之旅:高级篇(六)—— 网络流算法:Edmonds-Karp 算法与实际应用

               力扣(LeetCode) 是一个在线编程平台,主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目,以及它们的解题代码。              目录 引言  一、Edmonds-Karp 算法简介 二、算法实现 下面是使用 Python 实现的 Edmonds-Karp 算法:

    2024年02月22日
    浏览(41)
  • 【剑指offer专项突破版】整数篇(经典面试题)——C

    剑指offer专项突破版(力扣官网) —— 点击进入 本文所属专栏 ——点击进入 总结题目要求: 1.目的—— 实现除法 2.要求—— 不得使用 * / % 3.处理溢出—— -2 32 / - 1 返回2 31 - 1 4. 整数除法—— 向0取整 , 说明:在其他语言中,比如 Python的除法是相负无穷取整 的—— -7 /

    2024年02月07日
    浏览(50)
  • 《剑指 Offer》专项突破版 - 面试题 47 : 二叉树剪枝(C++ 实现)

    题目链接 :LCR 047. 二叉树剪枝 - 力扣(LeetCode) 题目 : 一棵二叉树的所有节点的值要么是 0 要么是 1,请剪除该二叉树中 所有节点的值全都是 0 的子树 。例如,在剪除下图 (a) 中二叉树中所有节点值都为 0 的子树之后的结果如下图 (b) 所示。 分析 : 首先分析哪些子树会被

    2024年02月20日
    浏览(39)
  • 《剑指 Offer》专项突破版 - 面试题 4 : 只出现一次的数字(C++ 实现)

    题目链接 :137. 只出现一次的数字 II - 力扣(LeetCode) 题目 : 输入一个整数数组,数组中只有一个数字出现了一次,而其他数字都出现了 3 次。请找出那个只出现一次的数字。例如,如果输入的数组为 [0, 1, 0, 1, 0, 1, 100],则只出现一次的数字是 100。 分析 : 这个题目有一个

    2024年02月02日
    浏览(44)
  • 【力扣刷题 | 第十七天】

    目录 前言: 55. 跳跃游戏 - 力扣(LeetCode) 45. 跳跃游戏 II - 力扣(LeetCode) 总结:         今天两道类型都是贪心算法,希望可以有所收获 给定一个非负整数数组  nums  ,你最初位于数组的  第一个下标  。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断

    2024年02月15日
    浏览(46)
  • 数据结构:力扣刷题

      给你一个  升序排列  的数组  nums  ,请你  原地  删除重复出现的元素,使每个元素  只出现一次  ,返回删除后数组的新长度。元素的  相对顺序  应该保持  一致  。然后返回  nums  中唯一元素的个数。 考虑  nums  的唯一元素的数量为  k  ,你需要做以下事情确

    2024年02月13日
    浏览(44)
  • 【力扣刷题 | 第七天】

    今天我们将会进入栈与队列的刷题篇章,二者都是经典的数据结构,熟练的掌握栈与队列实现可以巧妙的解决有些问题。 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的

    2024年02月09日
    浏览(49)
  • 力扣刷题19天

             这道题下面是前提:                                           如果没有这个前提,会出现下面情况(前序遍历会变成新的树):         运行代码:           下面代码中出现的问题:         和上面那道题逻辑一样。         运行代码:          

    2024年02月04日
    浏览(46)
  • 力扣刷题 - 数组篇

    https://leetcode.cn/problems/max-consecutive-ones/ 暴力解法: 定义一个变量来统计是否连续 https://leetcode.cn/problems/teemo-attacking/ 暴力解法: 记录每次中的开始时间与结束时间, 然后如果下一次中毒的是在结束时间之前, 就去更新开始时间(让它加上这个持续时间减去结束时间),如果是在之后

    2024年02月16日
    浏览(46)
  • 【力扣刷题 | 第十六题】

    目录 前言: 198. 打家劫舍 - 力扣(LeetCode) 213. 打家劫舍 II - 力扣(LeetCode)  总结: 我们今天继续刷动态规划的题,希望大家可以和我一起坚持下去。 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有

    2024年02月15日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包