【面试经典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()][]);
    }
}
相关推荐
南山不太冷几秒前
初识Spring(1)——mvc概念,部分常用注解
java·spring·mvc
&岁月不待人&5 分钟前
Kotlin和Java区别
java·开发语言·kotlin
wolf犭良8 分钟前
26、《Spring Boot OpenFeign:声明式服务调用与熔断降级深度实践》
java·spring boot·后端
白晨并不是很能熬夜41 分钟前
【JVM】字节码指令集
java·开发语言·汇编·jvm·数据结构·后端·javac
火烧屁屁啦1 小时前
【JavaEE进阶】Spring AOP详解
java·spring·java-ee
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧1 小时前
C语言_数据结构总结7:顺序队列(循环队列)
c语言·开发语言·数据结构·算法·visualstudio·visual studio
橘颂TA1 小时前
每日一练之合并两个有序链表
数据结构·链表
LIUJH12331 小时前
数据结构——单调栈
开发语言·数据结构·c++·算法
卡布奇诺-海晨1 小时前
JVM之Arthas的dashboard命令以及CPU飙高场景
java·spring boot
liujingtech1 小时前
Android如何让属性动画更加优雅与生命周期绑定
面试