zoukankan      html  css  js  c++  java
  • 剑指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 不能被继承的类

  • 相关阅读:
    【转载】为什么CPU有多层缓存
    【转载】二叉树的基本概念和实现
    【转载】如何系统地自学 Python?
    【原文】前端程序员必须知道的高性能Javascript知识
    【转载】重磅!中国人工智能/机器人/无人机创业公司100 | 智能内参
    【转载】分析重装系统也无法清除的鬼影病毒
    【转载】UML类图知识整理
    【转载】.NET程序员走向高端必读书单汇总
    【转载】齐次坐标的理解
    59. Spiral Matrix II
  • 原文地址:https://www.cnblogs.com/coding-fairyland/p/12333536.html
Copyright © 2011-2022 走看看