剑指offer

03 数组中重复的数字

public int findRepeatNumber(int[] nums){    //排序后的数组,重复元素必然相邻    Arrays.sort(nums);    //结果集    int res=0;    for(int i=0;i<nums.length-1;i  ){        //找到重复元素        if(nums[i]==nums[i 1]){            res=nums[i 1];            break;        }    }    return res;}

一个萝卜一个坑

如果没有重复数字,那么正常排序后,数字i应该在下标为i的位置,所以思路是重头扫描数组,遇到下标为i的数字如果不是i的话,(假设为m),那么我们就拿与下标m的数字交换。在交换过程中,如果有重复的数字发生,那么终止返回ture

 public int findRepeatNumber(int[] nums){        int temp;        for(int i=0;i<nums.length;i  ){            while(nums[i]!=i){                if(nums[i]==nums[nums[i]])                    return nums[i];                temp=nums[i];                nums[i]=nums[temp];                nums[temp]=temp;            }        }        return -1;    }

04 二维数组中的查找

右上角

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

05 替换空格

public String replaceSpace(String s) {    StringBuilder res = new StringBuilder();    for(int i=0;i<s.length();i  ){        if(s.charAt(i)==' '){            res.append(" ");        }else{            res.append(s.charAt(i));        }    }    return res.toString();}

06 从尾到头打印链表

public int[] reversePrint(ListNode head) {    LinkedList<Integer> stack = new LinkedList<Integer>();    while(head!=null){        stack.addLast(head.val);        head=head.next;    }        int[] res = new int[stack.size()];    for(int i=0;i<res.length;i  ){        res[i]=stack.removeLast();    }    return res;}

07 重建二叉树

    Map<Integer,Integer> hash = new HashMap<>();    public TreeNode buildTree(int[] preorder, int[] inorder) {        int np=preorder.length,n=inorder.length;        for(int i=0;i<n;i  ){            hash.put(inorder[i],i);        }        return dfs(preorder,inorder,0,np-1,0,n-1);    }    public TreeNode dfs(int[] pre,int[] in,int pl,int pr,int il,int ir){        if(pl>pr){return null;}        TreeNode root = new TreeNode(pre[pl]);        int k = hash.get(root.val)-il;        //left    前序中的下标区间,中序中的下标区间        root.left=dfs(pre,in,pl 1,pl k,il,il k-1);        //right        root.right=dfs(pre,in,pl k 1,pr,il k 1,ir);        return root;    }

09 用两个栈实现队列

class CQueue {    Deque<Integer> stack1;    Deque<Integer> stack2;    public CQueue() {        stack1=new LinkedList<Integer>();        stack2 = new LinkedList<Integer>();    }        //添加元素    public void appendTail(int value) {        stack1.push(value);    }        //删除头元素    public int deleteHead() {        if(stack2.isEmpty()){            while(!stack1.isEmpty())                stack2.push(stack1.pop());        }        if(stack2.isEmpty()){            return -1;        }else{            return stack2.pop();        }    }}

10-1 斐波那契

public int fib(int n){    int a=0,b=1,sum;    for(int i=0;i<n;i  ){        sum=(a b)00000007;        a=b;        b=sum;    }    return a;}

10-2 青蛙跳台阶

class Solution {    public int numWays(int n) {        int a=1,b=1,sum;        for(int i=0;i<n;i  ){            sum=(a b)00000007;            a=b;            b=sum;        }        return a;    }}

11 旋转数组的最小数字

class Solution {    public int minArray(int[] numbers) {        int l=0,r=numbers.length-1;        while(l<r){            int m=(l r)/2;            if(numbers[m]>numbers[r])   l=m 1;            else if(numbers[m]<numbers[r]) r=m;            else{                int x=l;                for(int k=l 1;k<r;k  ){                    if(numbers[k]<numbers[x])                        x=k;                }                return numbers[x];            }        }        return numbers[l];    }}

12 矩阵中的路径

class Solution {    public boolean exist(char[][] board, String word) {        char[] words = word.toCharArray();        for(int i=0;i<board.length;i  ){            for(int j=0;j<board[0].length;j  ){                if(dfs(board,words,i,j,0))                    return true;            }        }        return false;    }    public boolean dfs(char[][] board,char[] words,int i,int j,int k){        //超出范围或者不相等        if(i<0||i>board.length-1||j<0||j>board[0].length-1||board[i][j]!=words[k])  return false;        //base case k长度==word长度        if(k==words.length-1) return true;        //做选择        board[i][j]='\0';        //递归        boolean res=dfs(board,words,i 1,j,k 1)||dfs(board,words,i-1,j,k 1)            ||dfs(board,words,i,j 1,k 1)||dfs(board,words,i,j-1,k 1);        //撤销选择        board[i][j]=words[k];        return res;    }}

13 机器人的运动范围

class Solution {    int count;    public int movingCount(int m, int n, int k) {        int[][] visited=new int[m][n];        count=0;        dfs(m,n,k,visited,0,0);        return count;    }    public void dfs(int m,int n,int k,int[][] visited,int i,int j){        //1.索引越界2.大于数位之和3.走过        if(i>m-1||i<0||j>n-1||j<0||visited[i][j]==1||(k<sums(i) sums(j))) return;        //当前已经走过        visited[i][j]=1;        count  ;        //递归        int[] dx=new int[]{-1,0,1,0};int[] dy=new int[]{0,1,0,-1};        for(int s=0;s<4;s  ){            dfs(m,n,k,visited,i dx[s],j dy[s]);        }        //不需要撤销选择    }    //数位之和    int sums(int x){        int s=0;        while(x!=0){            s =x;            x=x/10;        }        return s;    }}

来源:https://www.icode9.com/content-4-881301.html

(0)

相关推荐

  • 寻找两个有序数组的中位数

    问题描述给定两个大小为m和n的有序数组nums1和nums2,找出这两个有序数组的中位数.示例一:nums1=[1,3]nums2=[2]则中位数为2示例二:nums1=[1,2]nums2=[3,4 ...

  • LeetCode之Missing Number

    LeetCode之Missing Number

  • 2020字节跳动的社招算法 三数之和

    引言   给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 1:通过双循环 + 二 ...

  • (1条消息) 两数之和,程序员才懂的 TwoSum 和 Abandon !

    (1条消息) 两数之和,程序员才懂的 TwoSum 和 Abandon !

  • (1条消息) 又一个同学被快手挂掉了

    今天是小浩算法 "365刷题计划" 第105天.这是昨天一个同学面试快手被问到的算法题,很不幸的是他被挂掉了.征得对方同意后,拿出来分享给大家~ (如果要进入算法交流群的, 关注后 ...

  • 【剑指Offer】数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不同时为0 解法1 最直接的思路,计算base的 ...

  • 【剑指Offer】链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 解法 基本思路是使用两个辅助指针p, q,让p先走k - 1步后,p, q两个指针再一起走 这样当p指针走到链表的末尾时,q指针刚好走到的就是倒数 ...

  • 【剑指Offer】反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头. 解法1 可以使用三个辅助指针pHead, last,next pHead记录当前节点,last记录上一个节点,next记录下一个节点 首先使用n ...

  • 剑指 Offer 14- I. 剪绳子

    我服了.动态规划杀我. 可以说一说解决动态规划的思路(只做了两三道就总结了emmm) 1.识别动态规划问题 --重叠子问题:大问题可以分为一个个子问题.和分治策略分割的子问题不同(分治问题的子问题是相 ...

  • 剑指 Offer 30. 包含min函数的栈

    定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例:MinStack minStack = ne ...

  • 剑指offer笔记面试题2----实现Singleton模式

    题目:设计一个类,我们只能生成该类的一个实例. 解法一:单线程解法 //缺点:多线程情况下,每个线程可能创建出不同的的Singleton实例 #include <iostream> usi ...

  • 每日一题 剑指offer(包含min函数的栈)

    编程是很多偏计算机.人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用.因此小白决定开辟一个新的板块"每日一题",通过每天一道编程题目来强化和锻炼自己的编程能力 ...

  • 每日一题 剑指offer(从上往下打印二叉树)

    编程是很多偏计算机.人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用.因此小白决定开辟一个新的板块"每日一题",通过每天一道编程题目来强化和锻炼自己的编程能力 ...

  • 每日一题 剑指offer(二叉搜索树的后序遍历序列)

    编程是很多偏计算机.人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用.因此小白决定开辟一个新的板块"每日一题",通过每天一道编程题目来强化和锻炼自己的编程能力 ...