【Java刷题】-String类OJ题

作者:学Java的冬瓜
博客主页:☀冬瓜的主页🌙
专栏:【Java刷题】

题1:字符串中的第一个唯一字符

链接:
LeetCode387.字符串中的第一个唯一字符

//思路:
//1、用count[]给26个字母计数,出现几次相应位置+1
//2、用字符串的字符ch-'a'得到该字符统计+1的位置(目的是节省空间,也可以直接开辟97('a')+26个空间)

class Solution {
    public int firstUniqChar(String s) {
        char[] count = new char[26];//定义并默认初始化
        int i=0;

        //这部分初始化可以不需要,因为new时默认初始化为0。
        // count[0] = 0;
        // while(i<26)
        // {
        //     count[i]=0;
        //     i++;
        // }

        //charAT()遍历字符串,count[]统计字符出现次数
        for(i=0;i<s.length();i++){
            char ch = s.charAt(i);
            count[ch-'a']+=1;
        }

        //再次遍历字符串,找到字符串中第一个字符(不能遍历count数组)
        for(i=0;i<s.length();i++){
            char ch = s.charAt(i);
            if(count[ch-'a']==1)
            {
                return i;
            }
        }
        return -1;
    }
}

题2:字符串最后一个单词的长度

链接:
牛客HJ1.字符串最后一个单词的长度

法一

//法一思路:从后往前找第一个' '
//1、分两种情况:有多个单词:找' '; 只有一个单词:直接输出字符串长度
//2、记录字符串最后一个字符的下标end,字符串中的字符从后往前找,找到' '下标,
//结果就是end-' '下标(相当于size-0,size和0都-1),然后break

import java.io.InputStream;
import java.util.*;

public class Main{
    
     public  static void  main(String [] args) throws Exception{
         Scanner scanner = new Scanner(System.in);
         String input = scanner.nextLine();
         
         int flag=0;
         int end=input.length()-1;
         for(int i=end;i>=0;i--){ //i>=0要满足,否则charAt()会字符串越界
             char ch=input.charAt(i);
             if(ch==' '){
                 flag=1;
                 System.out.println(end-i);
                 break;
             }
         }
         
         //flag==0表示字符串只有一个单词
         if(flag==0){
             System.out.println(input.length());
         }
     }
}

法二

//法二思路:利用字符串.lastIndexof('字符')找' '下标
import java.io.InputStream;
import java.util.*;

public class Main{
    
     public  static void  main(String [] args) throws Exception{
         
         Scanner scanner = new Scanner(System.in);
         String input = scanner.nextLine(); 
         int pos = 0;
         pos = input.lastIndexOf(' ');
         System.out.println(input.length()-1-pos);
     }
}

题3:验证回文串

链接:
LeetCode125.验证回文串

法一

//法一:用left,right两边判断字符,不相等就返回false
class Solution {

    public boolean isPalindrome(String s) {
        //1、转换成小写
        s = s.toLowerCase();
        
        //2、排除字母以外的字符
        StringBuilder sb1 = new StringBuilder();
        for(int i=0;i<s.length();i++){
            char ch = s.charAt(i);
            if(ch>='a'&&ch<='z' || ch>='A'&&ch<='Z' || ch>='0'&&ch<='9')
            sb1.append(ch);
        }
        String strsb1 = sb1.toString();

        //3、遍历字符串判断
        int left = 0;
        int right = strsb1.length()-1;
        while(left<=right){
            char leftstr = strsb1.charAt(left);
            char rightstr = strsb1.charAt(right);
            if(leftstr!=rightstr){
                return false;
            }

            left++;
            right--;
        }
        return true;
    }
}

法二

//法二:利用StringBuilder下的reverse()方法
//注意:逆置前新建转换为字符串,防止逆置时修改原串后找不到原字符串
class Solution {
    
    public boolean isPalindrome(String s) {
        //1、转换成小写
        s = s.toLowerCase();
        
        //2、排除字母以外的字符
        StringBuilder sb1 = new StringBuilder();
        for(int i=0;i<s.length();i++){
            char ch = s.charAt(i);
            if(ch>='a'&&ch<='z' || ch>='A'&&ch<='Z' || ch>='0'&&ch<='9')
            sb1.append(ch);
        }
        String strsb1 = sb1.toString();//逆置前新建转换为字符串,防止逆置时修改原串后找不到原字符串
        

        //3、逆置sb1
        StringBuilder rsb1 = sb1.reverse();
        String strrsb1 = rsb1.toString();
        
        //4、判断是否回文
        if(strsb1.equals(strrsb1)){
            return true;
        }else{
            return false;
        }
    }
}

题4:字符串中的单词数

链接:
LeetCode434.字符串中的单词数

//思路:
//将字符串用split分割为字符串数组。除去多算的空格。(如8个连续空格会多算7个,因为后一个会分割出前一个)
//注意, , ,abc以" "分割表示字符串有三个子串,逗号也算作单词
class Solution {
    public int countSegments(String s) {
        //1、移除s两边的空格
        s=s.trim();
        
        //2、遍历计算合格单词数
        String[] strings = s.split(" ");
        int count=0;
        for(int i=0;i<strings.length;i++){
            if(strings[i].length()!=0){//除去s内部多算的空格
                count++;
            }
        }
        //3、返回单词数
        return count;
    }
}
  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学Java的冬瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值