0
点赞
收藏
分享

微信扫一扫

Day5-剑指offer

流计算Alink 2022-04-03 阅读 67
javaleetcode

文章目录


一、翻转单词顺序

1.1题目

示例1:

示例2:

示例3:

1.2代码

思路:利用trim()函数去掉首尾空格,substring()拦截器,StringBuilder拼接字符串

class Solution {
    public String reverseWords(String s) {
        s=s.trim();
        int j=s.length()-1,i=j;
        StringBuilder sb=new StringBuilder();
        while(i>=0){
            while(i>=0&&(s.charAt(i)!=' '))i--;
            sb.append(s.substring(i+1,j+1)+' ');
            while(i>=0&&(s.charAt(i)==' '))i--;
            j=i;
        }
        return sb.toString().trim();
    }
}

二、和为s的连续正数序列

2.1题目

示例1:

示例 2:

2.2代码

思路1:

这个题面试官肯定会让你尝试新的解法

思路2:

在这里插入图片描述

class Solution {
    public int[][] findContinuousSequence(int target) {
        int i=1,j=2,s=3;
        List<int[]> list=new ArrayList<>();
        while(i<j){
            if(s==target){
                int a[]=new int[j-i+1];
                for(int k=i;k<=j;k++){
                    a[k-i]=k;
                   
                }
                 list.add(a);
                
            }
            if(s>=target){
                s=s-i;
                i++;
            }
            else{
                j++;
                s=s+j;
            }
            
        }
        return list.toArray(new int [0][]);
    }
}

三、第一个只出现一次的字符

3.1题目

示例 1:

示例 2:

3.2代码

方案一
可用HashMap key唯一的关键

class Solution {
    public char firstUniqChar(String s) {
        char a=' ';
        if(s.length()==0||s==null) return a;
        HashMap<Character,Integer> map=new HashMap<>();
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);
            if(map.containsKey(c)){
                map.put(c,map.get(c)+1);
            }else map.put(c,1);
        }
        for(int i=0;i<s.length();i++){
            if(map.get(s.charAt(i))==1){
                return s.charAt(i);
            }
        }
        return a;
    }
}

方案二
因为只存储26个英文字母的小写 可以利用数组来存储
例如 a[0]=1,a[1]=0,表示第一个字母出现1次 第二个字母出现0次

class Solution {
    public char firstUniqChar(String s) {
        if(s == null || s.length() == 0) return ' ';
        int[] count = new int['z' - 'a' + 1];  //因为s只包含了小写字母
        for(int i = 0;i < s.length();i++){
            count[s.charAt(i) - 'a'] ++;
        }
        for(int i = 0;i < s.length();i++){
            if(count[s.charAt(i) - 'a'] == 1)
                return s.charAt(i);
        }
        return ' ';
    }
}

四、圆圈中最后剩下的数字(约瑟夫环)

4.1题目

例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。

示例 1:

示例 2:

4.2代码

这个题重要的思路得对 像我就想了半天没有想出来!!!需要用到动态规划的知识
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码:

class Solution {
    public int lastRemaining(int n, int m) {
        int ans=0;
        for(int i=2;i<=n;i++){
            ans=(ans+m)%i;
            
        }
        return ans;
    }
}
举报

相关推荐

0 条评论