面试经典150题(38-41)

leetcode 150道题 计划花两个月时候刷完,今天(第十六天)完成了4道(38-41)150:

38.(1. 两数之和)题目描述:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。

第一版(这个题是我第一次接触leetcode时候,真的当时这个题也是费了好多时间,但是现在我真的都快能默写下来了,对我来说这道题是最经典的)

class Solution {
    
    
    public int[] twoSum(int[] nums, int target) {
    
    
        Map<Integer,Integer> map=new HashMap();
        for(int i=0;i<nums.length;i++){
    
    
            int temp=target-nums[i];
            if(map.containsKey(temp)){
    
    
                return new int[]{
    
    map.get(temp),i};
            }
            map.put(nums[i],i);
        }
        return new int[]{
    
    };
    }
}

39.(202. 快乐数)题目描述:

编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false

第一版(看到这个题第一反应就是咋去判断什么时候该结束循环。。然后我就去百度百科查了一下:不快乐数都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 循环)
(但是解题里面有个老哥想法也很好,用快慢指针去计算,真的面试遇到我估计也会去用快慢指针去做的,定义啥的谁能记住。。)

class Solution {
    
    
    public boolean isHappy(int n) {
    
    
         // 不快乐数都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 循环
         int[] nums={
    
    4,16,37,58,89,145,42,20,4};
         int index=0;
         while(index<nums.length&&n!=1){
    
    
             n=toHappy(n);
             if(n==nums[index]){
    
    
                 index++;
             }else{
    
    
                 index=0;
             }
         }
         if(index==nums.length){
    
    
             return false;
         }
         return true;

    }
    public int toHappy(int n) {
    
    
        int sum=0;
        while(n!=0){
    
    
            int temp=n%10;
            sum+=temp*temp;
            n=n/10;
        }
        return sum;
    }
}

第二版(老哥快慢指针)

class Solution {
    
    
    public boolean isHappy(int n) {
    
    
        int low=n;
        int fast=n;
        do{
    
    
            low=toHappy(low);
            fast=toHappy(fast);
            fast=toHappy(fast);
        }while(low!=fast);
        return low==1;
    }
    public int toHappy(int n) {
    
    
        int sum=0;
        while(n!=0){
    
    
            int temp=n%10;
            sum+=temp*temp;
            n=n/10;
        }
        return sum;
    }
}

40.(219. 存在重复元素 II)题目描述:

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false

第一版(这个没啥好说的,直接上代码)

class Solution {
    
    
    public boolean containsNearbyDuplicate(int[] nums, int k) {
    
    
        Map<Integer,Integer> map=new HashMap();
        for(int i=0;i<nums.length;i++){
    
    
            if(map.containsKey(nums[i])){
    
    
                if(Math.abs(i-map.get(nums[i]))<=k){
    
    
                    return true;
                }
            }
            map.put(nums[i],i);
        }
        return false;
    }
}

41.(128. 最长连续序列)题目描述:

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

第一版(题目让用O(n)的复杂度,但是我不知道我的是不是,所以我就先没管这个要求先做出来再说。。)

class Solution {
    
    
    public int longestConsecutive(int[] nums) {
    
    
        int len=nums.length;
        if(len<=1)
            return len;
        Arrays.sort(nums);
        int res=0;
        int temp=1;
        int preNum=nums[0];
        for(int i=1;i<nums.length;i++){
    
    
            if(preNum==nums[i])
                continue;
            if(nums[i]-1==preNum){
    
    
                temp++;
            }else{
    
    
                res=Math.max(res,temp);
                temp=1;
            }
            preNum=nums[i];
        }
        res=Math.max(res,temp);
        return res;
    }
}

第二版(看了解题,是真的O(n)!!!)

class Solution {
    
    
    public int longestConsecutive(int[] nums) {
    
    
        Set<Integer> set=new HashSet();
        for(int num:nums){
    
    
        // 去除重复的数字
            set.add(num);
        }
        int res=0;
        for(int num:nums){
    
    
        // 这个就是去判断这个数字能不能做头
            if(!set.contains(num-1)){
    
    
                int currentNum=num;
                int temp=1;
                // 看以这个头能走多远
                while(set.contains(currentNum+1)){
    
    
                    currentNum++;
                    temp++;
                }
                res=Math.max(temp,res);
            }
        }
        return res;
    }
}

第十六天了好快,现在是又想过的快又想过的慢,好矛盾的我,加油吧,早日跳槽!!!!

猜你喜欢

转载自blog.csdn.net/weixin_44061648/article/details/135119237
今日推荐