【面试经典150】day 10

发布于:2024-11-04 ⋅ 阅读:(116) ⋅ 点赞:(0)

目录

1.验证回文串

 2.判断子序列

 3.两数之和 II - 输入有序数组

4.盛最多水的容器

 5.三数之和

1.验证回文串

class Solution {
    public boolean isPalindrome(String s) {
        int i=0,j=s.length()-1;
        while(i<j){
            //跳过非数字/字母
            while(i<j&&!Character.isLetterOrDigit(s.charAt(i))) i++;
            while(i<j&&!Character.isLetterOrDigit(s.charAt(j))) j--;
            if(Character.toLowerCase(s.charAt(i))!=Character.toLowerCase(s.charAt(j))) return false;
            i++;j--;
        }
        return true;
    }
}

 2.判断子序列

class Solution {
    public boolean isSubsequence(String s, String t) {
        //判断s是否是t的子序列
        //s为空肯定是子序列
        if(s.length()==0) return true;
        for(int i=0,j=0;j<t.length();j++){
            if(s.charAt(i)==t.charAt(j)){
                //如果已经到s的末端
                if(++i==s.length()){
                    return true;
                }
            }
        }
        return false;
    }
}

 ps:

 3.两数之和 II - 输入有序数组

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int i=0,j=numbers.length-1;
        while(i<j){
            int s=numbers[i]+numbers[j];
            if(s<target){
                i++;
            }else if(s>target){
                j--;
            }else return new int [] {i+1,j+1};
        }
        return new int[0];
    }
}
class Solution {
    public int maxArea(int[] height) {
        //本质上直接向内收缩就可以了
        int num1=0,num2=height.length-1;
        int mx=0;
        while(num1<num2){
           mx=Math.max(mx,Math.min(height[num1],height[num2])*(num2-num1));
           if(height[num1]<height[num2]){
                num1++;
            }else{
                num2--;
            }
        }

        return mx;
    }
}

4.盛最多水的容器

class Solution {
    public int maxArea(int[] height) {
        //本质上直接向内收缩就可以了
        int num1=0,num2=height.length-1;
        int mx=0;
        while(num1<num2){
           mx=Math.max(mx,Math.min(height[num1],height[num2])*(num2-num1));
           if(height[num1]<height[num2]){
                num1++;
            }else{
                num2--;
            }
        }

        return mx;
    }
}

 5.三数之和

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> ret=new ArrayList<>();
        Arrays.sort(nums);
        int n=nums.length;
        //k,i,j 3个指针
        for(int k=0;k<n-2;k++){
            if(nums[k]>0){
                break;
            }
            //去除重复项
            if(k>0&&nums[k]==nums[k-1]){
                continue;
            }
            int i=k+1;
            int j=n-1;
            while(i<j){
                int s=nums[k]+nums[i]+nums[j];
                if(s<0){
                    //每次移动都去除重复
                    i++;
                    while(i<j&&nums[i]==nums[i-1]){
                        i++;
                    }
                }else if(s>0){
                    j--;
                    while(i<j&&nums[j]==nums[j+1]){
                        j--;
                    }
                }else{
                    //转为[a,b,c]格式
                    ret.add(Arrays.asList(nums[k],nums[i],nums[j]));
                    i++;
                    j--;
                    while(i<j&&nums[i]==nums[i-1]){
                        i++;
                    }
                    while(i<j&&nums[j]==nums[j+1]){
                        j--;
                    }
                }
            }
        }
        return ret;
    }
}

 


网站公告

今日签到

点亮在社区的每一天
去签到