美文网首页硬核空间技术博客
每日一题之《剑指offer》40,41题

每日一题之《剑指offer》40,41题

作者: 憨憨二师兄 | 来源:发表于2020-03-19 16:28 被阅读0次

    第40题:数组中只出现一次的数字

    难易度:⭐⭐⭐

    题目描述:
    一个整型数组里除了两个数字之外,其他的数字都出现了两次。
    请写程序找出这两个只出现一次的数字。
    num1,num2分别为长度为1的数组。传出参数
    将num1[0],num2[0]设置为返回结果
    

    本题重点考察的是异或运算,本题目在原书中讲解的非常到位:



    代码如下:

    public class Solution {
        public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
            if(array == null || array.length < 2){
                return;
            }
            int resultExclusiveOr = 0;
            for(int i = 0;i < array.length;i++){
                resultExclusiveOr ^= array[i];
            }
            int indexOfBit1 = findFirstBitIs1(resultExclusiveOr);
            num1[0] = 0;
            num2[0] = 0;
            for(int i = 0;i < array.length;i++){
                if(isBit1(array[i],indexOfBit1)){
                    num1[0] ^= array[i]; 
                }else{
                    num2[0] ^= array[i];
                }
            }
            
        }
        
        public static int findFirstBitIs1(int num){
            int indexBit = 0;
            while((num & 1) == 0 && indexBit < 32){
                num = num >> 1;
                indexBit++;
            }
            return indexBit;
        }
        public static boolean isBit1(int num,int indexBit){
            num = num >> indexBit;
            return (num & 1) == 1;
        }
    }
    

    第41题:和为S的连续正数序列

    难易度:⭐⭐⭐

    题目描述:
    小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。
    但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。
    没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。
    现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?
    输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
    

    只需要标记一个序列的起始位置的数字,和一个序列结束位置的数字即可,思路不难想,重点在于

    int middle = (sum + 1) >> 1;
    

    当标记一个序列其实位置的数字start < middle时,才存在这样的一个序列,如果要求和sum等于100,如果start都等于50,那么标记序列结束为止的数字end最小都是51,所以只有在start < middle时,满足我们需要的结果,这一点请自己体会。
    代码如下:

    import java.util.ArrayList;
    public class Solution {
        public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
            ArrayList<ArrayList<Integer>> list = new ArrayList<>();
            if(sum < 3){
                return list;
            }
            
            int start = 1;
            int end = 2;
            int middle = (sum + 1) >> 1;
            int curSum = start + end;
            
            while(start < middle){
                if(curSum == sum){
                    list.add(addToArrayList(start,end));
                }
                while(curSum > sum && start < middle){
                    curSum -= start;
                    start++;
                    if(curSum == sum){
                        list.add(addToArrayList(start,end));
                    }
                }
                end++;
                curSum += end;
            }
            return list;
        }
        
        public static ArrayList<Integer> addToArrayList(int start,int end){
            ArrayList<Integer> arrayList = new ArrayList<>();
            for(int i = start;i <= end;i++){
                arrayList.add(i);
            }
            return arrayList;
        }
    }
    

    相关文章

      网友评论

        本文标题:每日一题之《剑指offer》40,41题

        本文链接:https://www.haomeiwen.com/subject/rsslyhtx.html