leetcode题解:字符串


🏚1.整数反转

在这里插入图片描述
解题思路
在这里插入图片描述
代码

class Solution {
    public int reverse(int x) {
        int result=0;
        while(x!=0){
           int y=x%10;//得到个位数字
           int newResult=result*10+y;
            if((newResult-y)/10!=result){return 0;}
            result=newResult;
            x=x/10;
        }
        return result;
    }
}

🏚2.字符串中的第一个唯一字符

在这里插入图片描述
解题思路 把字符串的字符放入hashmap中,key为字符,value为次数,在遍历一次取得value为1的字符。
代码

class Solution {
    public int firstUniqChar(String s) {
       HashMap<Character,Integer> map=new HashMap<Character,Integer>();
         int n= s.length();
        for(int i=0;i<n;i++){
            char m=s.charAt(i);
            map.put(m,map.getOrDefault(m,0)+1);
        }
        
         for(int i=0;i<n;i++){
             char m=s.charAt(i);
            if(map.get(m)==1){return i;}
        }
        return -1;
    }
}

🏚3.有效的字母异位词

在这里插入图片描述
解题思路 定义一个大小为26的数组,代表字母a到z,将字符串s内的字符次数存入数组,同时减去字符串t的字符出现次数。最后判断数组是否所有元素为0。
代码

class Solution {
    public boolean isAnagram(String s, String t) {
      if(s.length()!=t.length()){return false;}
    
    int[] counter = new int[26];
    for(int i=0;i<s.length();i++){
        counter[s.charAt(i)-'a']++;
        counter[t.charAt(i)-'a']--;
    }
    for(int count:counter){
        if(count!=0){return false;}
    }
    return true;
}}

🏚4.字符串转换整数 (atoi)

在这里插入图片描述代码

class Solution {
    public int myAtoi(String str) {
     int i=0;  
     int length=str.length();
        while(i<length&&str.charAt(i)==' '){
           //找到第一个非空字符
            i++;
        }
        //如果字符串全空
        if(i==length){return 0;}
        //确定符号
        int flag=1;
        if(str.charAt(i)=='+'||str.charAt(i)=='-'){
            if(str.charAt(i)=='-'){flag=-1;}
            i++;
        }
        //定义结果
        int ans=0;
        while(i<length&&Character.isDigit(str.charAt(i))){//如果第一个字符是数字,再进行运算。
            int temp=str.charAt(i)-'0';//将当前字符转换为数字
            if(flag==1&&(ans>Integer.MAX_VALUE/10||(ans==Integer.MAX_VALUE/10&&temp>7))){//正数溢出
                return Integer.MAX_VALUE;}
            if(flag==-1&&(-ans<Integer.MIN_VALUE/10||(-ans==Integer.MIN_VALUE/10&&temp>8))){//负数溢出
                return Integer.MIN_VALUE;}
            ans=ans*10+temp;
            i++;
        }
        return ans*flag;
    }
}

🏚5.实现 strStr()

在这里插入图片描述
解题思路定义一个和needle字符串一样大小的滑动窗口,从haystack字符串开头开始匹配,成功匹配则返回当前首字母下标,若遍历完haystack字符串都不匹配则返回-1。
代码

class Solution {
    public int strStr(String haystack, String needle) {
        if(needle==null){return 0;}
        int l=needle.length();
        int n=haystack.length();
        for(int start=0;start<n-l+1;start++){
            if(haystack.substring(start,start+l).equals(needle)){return start;}
        }
        return -1;
    }
}

🏚6.外观数列

在这里插入图片描述
解题思路观察得知,当前项和上一项有紧密的联系,所以递归得到上一项的字符串,遍历得到不同字符出现的次数,并将次数存起来,每查询完一个数字出现的次数,将次数和当前数字字符拼接进结果字符串
代码

class Solution {
    public String countAndSay(int n) {
        if(n==1){return "1";}
        StringBuilder builder=new StringBuilder();
        //得到上一 项
        String str=countAndSay(n-1);
        //从头开始遍历
        int i=0;
        while(i<str.length()){
            //得到当前字符
            char now=str.charAt(i);
            int count=1;
            //遍历得到当前字符的次数并存储到count中
            for(int j=i+1;j<str.length();j++){
                if(str.charAt(i)!=str.charAt(j)){break;}
                if(str.charAt(i)==str.charAt(j)){count++;}
            }
            //将次数与字符存到字符串内
            builder.append(count).append(now);
            //将遍历的数字往下移到下一个不一样的字符
            i=i+count;
        }
        return builder.toString();
        
    }
}

🏚7.最长公共前缀

在这里插入图片描述
解题思路 首先取出第一个字符串,作为最长前缀a,遍历剩余的字符串,每遍历一个字符串,得到其与a的前缀并赋值给a。最终a就是所有字符串的最长前缀
代码

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length==0){return "";}
        if(strs.length==1){return strs[0];}
        String a=strs[0];
        for(int i=1;i<strs.length;i++){
               int j=0;
            while(j<strs[i].length()&&j<a.length()){
              if(strs[i].charAt(j)!=a.charAt(j)){break;}  
                j++;
            }
            a=a.substring(0,j);
        }
        return a;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值