• 剑指offer题目--面试中的各项能力章


    38 数字在排序数组中出现的次数

    方法1:二分法:

    public class Solution {
        public int GetNumberOfK(int [] array , int k) {
           int number = 0;
            int len = array.length;
            if(array != null && len >0){
                int first = GetFirstK(array, len,k, 0,len-1);
                int last = GetLastK(array, len,k,0,len-1);
                
                if(first > -1 && last > -1){
                    number = last-first+1;
                }
            }
            return number;
        }
        
        int GetFirstK(int[] array, int length, int k, int start, int end){
            if(start > end){
                return -1;
            }
            int midIndex = (start + end)/2;
            int midData = array[midIndex];
            
            if(midData == k){
                if((midIndex > 0 && array[midIndex -1] != k) || midIndex==0){
                    return midIndex;
                }else{
                    end = midIndex -1;
                }
            }else if(midData > k){
                end = midIndex - 1;
            }else{
                start = midIndex +1;
            }
            return GetFirstK(array, length, k, start, end);
        }
        
            int GetLastK(int[] array, int length, int k, int start, int end){
            if(start > end){
                return -1;
            }
            int midIndex = (start + end)/2;
            int midData = array[midIndex];
            
            if(midData == k){
                if((midIndex <length-1 && array[midIndex + 1] != k) || midIndex==length-1){
                    return midIndex;
                }else{
                    start = midIndex + 1;
                }
            }else if(midData < k){
                start = midIndex +1;
            }else{
                end = midIndex - 1;
            }
            return GetLastK(array, length, k, start, end);
        }
    }

    39 二叉树的深度

    public class Solution {
        public int TreeDepth(TreeNode root) {
            if(root == null){
                return 0;
            }
            int left = TreeDepth(root.left);
            int right = TreeDepth(root.right);
            
            return (left>right)?(left+1):(right+1);
        }
    }

    ****拓展:平衡二叉树

    二叉树中任意结点的左右子树的深度相差不超过1就是平衡二叉树。

    解法1:

    public class Solution {
        public boolean IsBalanced_Solution(TreeNode root) {
            if(root == null){
                return true;
            }
            int left = TreeDepth(root.left);
            int right = TreeDepth(root.right);
            int diff = left-right;
            if(diff > 1 || diff < -1){
                return false;
            }
            return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
        }
        
            public int TreeDepth(TreeNode root) {
            if(root == null){
                return 0;
            }
            int left = TreeDepth(root.left);
            int right = TreeDepth(root.right);
            
            return (left>right)?(left+1):(right+1);
        }
    }

    解法2:每个结点遍历一次 ---未通过所有用例

    public class Solution {
        public boolean IsBalanced_Solution(TreeNode root) {
            int depth = 0;
            return IsBalanced_Solution(root, depth);
        }
        
        public boolean IsBalanced_Solution(TreeNode root, int depth) {
            if(root == null){
                depth = 0;
                return true;
            }
            int left=depth;
            int right=depth;
            if(IsBalanced_Solution(root.left, left) && IsBalanced_Solution(root.right, right)){
                int diff = left - right;
                if(diff <= 1 && diff >= -1){
                    depth = 1+(left>right ? left:right);
                    return true;
                }
            }
            return false;
        }
    }

    40 数组中只出现一次的数字

    --未通过

    //num1,num2分别为长度为1的数组。传出参数
    //将num1[0],num2[0]设置为返回结果
    public class Solution {
        public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
           if(array.length < 2){
               return;
           }
            if(array.length == 2){
                num1[0] = array[0];
                num2[0] = array[1];
                return;
            }
            
            int resultExclusiveOR = array[0];
            for(int i=0; i<array.length; ++i){
                resultExclusiveOR ^= array[i];
            }
            int indexOf1 = FindFirstBitIs1(resultExclusiveOR);
            
            for(int j=0; j<array.length;++j){
                if(IsBit1(array[j],indexOf1)){
                    num1[j] ^= array[j];
                }else{
                    num2[j] ^= array[j];
                }
            }
        }
        
        int FindFirstBitIs1(int num){
            int indexBit = 0;
            while((num &1)==0 && indexBit < 32){
                num = num >>1;
                indexBit++ ;
            }
            return indexBit;
        }
        
        boolean IsBit1(int num, int indexBit){
            num = num >> indexBit;
            return (num&1) == 1;
        }
    }

    41 和为s的两个数字 VS 和为s的连续正数序列

    42 反转单词顺序 VS 左旋转字符串

    43 n个骰子的点数

    44 扑克牌的顺子

    45 圆圈中最后剩下的数字

    46 求1+2+...+n

    47 不用加减乘除做加法

    48 不能被继承的类

  • 相关阅读:
    JavaScript 为字符串添加样式 【每日一段代码80】
    JavaScript replace()方法 【每日一段代码83】
    JavaScript for in 遍历数组 【每日一段代码89】
    JavaScript 创建用于对象的模板【每日一段代码78】
    html5 css3 新元素简单页面布局
    JavaScript Array() 数组 【每日一段代码88】
    JavaScript toUTCString() 方法 【每日一段代码86】
    位运算
    POJ 3259 Wormholes
    POJ 3169 Layout
  • 原文地址:https://www.cnblogs.com/coding-fairyland/p/12333536.html
Copyright © 2020-2023  润新知