【面试经典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()][]);
    }
}
相关推荐
尽兴-3 分钟前
Redis模拟延时队列 实现日程提醒
java·redis·java-rocketmq·mq
SSL_lwz9 分钟前
P11290 【MX-S6-T2】「KDOI-11」飞船
c++·学习·算法·动态规划
zhangpz_20 分钟前
c ++零基础可视化——vector
c++·算法
书埋不住我23 分钟前
java第三章
java·开发语言·servlet
boy快快长大25 分钟前
将大模型生成数据存入Excel,并用增量的方式存入Excel
java·数据库·excel
孟秋与你28 分钟前
【spring】spring单例模式与锁对象作用域的分析
java·spring·单例模式
菜菜-plus32 分钟前
java 设计模式 模板方法模式
java·设计模式·模板方法模式
萨达大33 分钟前
23种设计模式-模板方法(Template Method)设计模式
java·c++·设计模式·软考·模板方法模式·软件设计师·行为型设计模式
tian-ming34 分钟前
(十八)JavaWeb后端开发案例——会话/yml/过滤器/拦截器
java·开发语言·前端
不能只会打代码38 分钟前
大学课程项目中的记忆深刻 Bug —— 一次意外的数组越界
java·github·intellij-idea·话题博客