【面试经典150】day 13

目录

1.有效的字母异位词

2.字母异位词分组

3.两数之和

4.快乐数

[5.存在重复元素 II](#5.存在重复元素 II)

6.最长连续序列

7.汇总区间

8.合并区间

1.有效的字母异位词

java 复制代码
class Solution {
    public boolean isAnagram(String s, String t) {
        //貌似字符串中的字符计算,比较即可
        int [] x=counter(s),y=counter(t);
        for(int i=0;i<x.length;i++){
            if(x[i]!=y[i]){
                return false;
            }
        }
        return true;
    }
    private int [] counter(String s){
        int [] ans=new int[26];
        for(int i=0;i<s.length();i++){
            ans[s.charAt(i)-'a']++;
        }
        return ans;
    }
}

2.字母异位词分组

java 复制代码
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        //我想到一个方法,sort重排每一个字符串,然后进行分组就可以了。
        //先建一个哈希表
        Map<String,List<String>>m=new HashMap<>();
        for(String str:strs){
            char [] s=str.toCharArray();
            Arrays.sort(s);
            //s相同的字符串分到同一组
            m.computeIfAbsent(new String(s),k->new ArrayList<>()).add(str);
        }
        return new ArrayList<>(m.values());
    }
}

3.两数之和

java 复制代码
class Solution {
    public int[] twoSum(int[] nums, int target) {
         Map<Integer,Integer> map=new HashMap<>();
         for(int i=0;i<nums.length;i++){
            if(map.containsKey(target-nums[i])){
                return new int[] {map.get(target-nums[i]),i};
            }
            map.put(nums[i],i);
         }
         throw new IllegalArgumentException("No two sum solution.");
    }
}

4.快乐数

java 复制代码
class Solution {

    //快乐数并不快乐
    //快慢指针,相遇就不是,遇到1就是
        
        
        //负责拆解
    public int getNext(int n){
            int totalSum=0;
            while(n>0){
                int d=n%10;
                n=n/10;
                totalSum+=d*d;
            }
            return totalSum;
    }
     //判断是不是快乐数
    public boolean isHappy(int n) {
            int slow=n;
            int fast=getNext(n);
            while(fast!=1&&slow!=fast){
                //慢走1步,快走2步
                slow=getNext(slow);
                fast=getNext(getNext(fast));
            }
            return fast==1;
        }
    }

5.存在重复元素 II

java 复制代码
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;
    }
}

6.最长连续序列

java 复制代码
class Solution {
    public int longestConsecutive(int[] nums) {
        if(nums==null||nums.length==0){
            return 0;
        }
        //对数组排序
        Arrays.sort(nums);

        int longest=1;
        int count=1;

        for(int i=1;i<nums.length;i++){
            if(nums[i]!=nums[i-1]){
                if(nums[i]==nums[i-1]+1){
                    count++;
                }else{
                    longest=Math.max(longest,count);
                    count=1;
                }
            }
        }
        return Math.max(longest,count);
    }
}

]

java 复制代码
class Solution {
    public int longestConsecutive(int[] nums) {
        //先排序再遍历的话复杂度会超过O(n)
        //创建哈希集合
        Set<Integer> num_set=new HashSet<Integer>();
        for(int num:nums){
            //将数组中每个整数添加到集合,去除重复元素
            num_set.add(num);
        }

        int longest=0;
        for(int num:num_set){
            //如果集合不包含当前整数-1的值,说明整数困难是连续序列的起点
            if(!num_set.contains(num-1)){
                int cur=num;
                int count=1;
                //当集合包含当前数字+1的值,说明连续序列可以继续延伸
                while(num_set.contains(cur+1)){
                    cur+=1;
                    count+=1;
                }
                longest=Math.max(longest,count);
            }
        }
        return longest;
    }
}

7.汇总区间

java 复制代码
class Solution {
    public List<String> summaryRanges(int[] nums) {
        //感觉就是一次遍历,不断更新并创建边界值即可
        //双指针
        List<String> ret=new ArrayList<>();
        for(int i=0,j,n=nums.length;i<n;i=j+1){
            j=i;
            while(j+1<n&&nums[j+1]==nums[j]+1){
                ++j;
            }
            ret.add(f(nums,i,j));
        }
        return ret;
    }

    private String f(int [] nums,int i,int j){
            return i==j?nums[i]+"":String.format("%d->%d",nums[i],nums[j]);
    }
}

8.合并区间

java 复制代码
class Solution {
    public int[][] merge(int[][] intervals) {
        //按照第一个元素排序
        Arrays.sort(intervals,(a,b)->a[0]-b[0]);
        List<int[]> ret=new ArrayList<>();
        for(int [] p:intervals){
            //当前区间左端点<=最后一个区间右端点,可以合并
            if(!ret.isEmpty()&&p[0]<=ret.get(ret.size()-1)[1]){
                ret.get(ret.size()-1)[1]=Math.max(ret.get(ret.size()-1)[1],p[1]);
            }else{
                //不能合并,添加区间
                ret.add(p);
            }
        }
        return ret.toArray(new int[ret.size()][]);
    }
}
相关推荐
CodeQingqing5 分钟前
C语言练手磨时间
c语言·数据结构·算法
向哆哆8 分钟前
Eclipse Java 开发调优:如何让 Eclipse 运行更快?
java·ide·eclipse
爱晒太阳的小老鼠14 分钟前
策略模式-枚举实现
java·策略模式
77tian21 分钟前
设计模式的原理及深入解析
java·开发语言·单例模式·设计模式·代理模式·享元模式·原型模式
卡尔曼的BD SLAMer1 小时前
计算机视觉与深度学习 | Python实现EMD-SSA-VMD-LSTM时间序列预测(完整源码和数据)
python·深度学习·算法·cnn·lstm
会飞的架狗师1 小时前
【Spring Cloud Gateway】Nacos整合遇坑记:503 Service Unavailable
java·开发语言
yu_anan1111 小时前
Denoising Score Matching with Langevin Dynamics
算法·机器学习·概率论
重生之后端学习2 小时前
02-前端Web开发(JS+Vue+Ajax)
java·开发语言·前端·javascript·vue.js
小葡萄20252 小时前
黑马程序员C++2024新版笔记 第三章 数组
笔记·算法·c++20
字节源流8 小时前
关于maven的依赖下不下来的问题
java·maven