几个String的实训题目

时间:2024-09-30 13:02:36

1. 第一个只出现一次的字符

字符串最后一个单词的长度_牛客题霸_牛客网 (nowcoder.com)

题目:

思路:

        每个字符都有各自的阿斯克码值:A的ASCII是65,a的ASCII是97,由题目可以知道,s只有小写字母,那么我们就可以拿一个整形数组,通过它的下标来对应每个字母的ASCII码的值,但是a的阿斯克吗是97,那么我们需要开辟一个很大的长度吗?不需要,我们只要每次操作字符的时候减去97就可以了,0下标就代表a,然后遍历s的时候在这个字符对应的整形数组的位置的值进行++,最后再遍历一次,找到值为1的下标返回即可.

        1. 申请一个整形数组用来计数

        2. 遍历字符串的每个字符,把字符出现的次数存储再数组里面

        3. 再次遍历,找到数组值为1的下标,并且返回

public int firstUniqChar(String s) {
        //第一个只出现一次的字符
        //1.申请一个数组 计数数组
        int[] count = new int[25];
        //2.遍历字符串的每个字符, 把字符出现的次数存储在数组里面
        for (int i = 0; i < s.length(); i++) {
            //取出每个字符
           char ch = s.charAt(i);
            //记数数组相应位置++
            count[ch - 'a'] += 1;
        }
        //3.再次遍历字符串的每个字符,如果在数组里面是1,那么就返回当前的数组下标
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if(count[ch - 'a'] == 1) {
                return i;
            }
        }
        return - 1;
    }

        其中,我们取出每个字符的时候就用到了String的常用方法 字符串名.charAt(下标)

其他常用的String方法可以看这个:

String类-****博客

        然后我们把计数数组相应的位置进行++操作:count[ch - 'a'];也可以写成-97,主要目的就是把它平移到对应整形数组下标,然后对该下标进行++操作.

2. 最后一个单词的长度

字符串最后一个单词的长度_牛客题霸_牛客网 (nowcoder.com)

        题目:

in.hasNextInt() 判断有无输入了整形
 in.nextInt(); 从控制台读取一个输入整形

法一:

思路:

我们晓得每个单词都被空格所分开,因此我们只要找到最后一个空格的位置然后就能找到最后一个单词的位置,然后我们就可以轻松获得它的长度

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // // 检查是否有下一行
           String s = in.nextLine();// 读取整行
            //获取最后一个空格的位置
           int index = s.lastIndexOf(' ');
            //获取字串
            String str = s.substring(index + 1);
            System.out.println(str.length());
        }
    }

我们通过s.lastIndexOf(' ');来获取最后一个空格的下标

然后我们获取该字符串的子串,通过subString(index+1)获得该字串

最后通过length()方法就可以获得长度了

法二:

我们先对输入的字符串进行分割,以任意空格为分隔符进行,分割,然后通过返回的字符数组,我们直接用最后一个坐标来获取最后一个单词的位置,然后就可以获得长度了

 public class Main {
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            // 读取一行文本  
            System.out.println("请输入一些文本(使用空格分隔单词):");
            String s = in.nextLine();

            // 使用空格作为分隔符分割字符串  
            String[] ch = s.split("\\s+"); // \\s+ 表示一个或多个空白字符  

            // 检查数组是否为空或没有元素  
            if (ch.length > 0) {
                // 获取最后一个单词  
                String lastWord = ch[ch.length - 1];
                // 获取最后一个单词的长度  
                int len = lastWord.length();
                System.out.println("最后一个单词是:" + lastWord + ",长度为:" + len);
            } else {
                System.out.println("没有输入单词。");
            }

            // 关闭 Scanner  
            in.close();
        }
    }

"\\s+" 是一个正则表达式,其中:​​​​​​​\\s 表示任何空白字符(包括空格、制表符、换页符等)。+ 表示前面的元素(在这里是空白字符)可以出现一次或多次。

3. 检测字符串是否为回文

125. 验证回文串 - 力扣(LeetCode)

题目:

我们先来解释以下什么是回文串,也就是正着读的意思和反正读的意思一致,形成了一个对称

根据实例1,我们可以看出来,这个是忽略大小写的,所以我们要把大小写统一起来,然后我们要定义俩个标记遍历,i,j分别指向这个数组的头和尾,如果i所指向的值==j所指向的值,那么i++,j--,如果i里面的指向的值是非数字字母的值,i++,j如果指向的值是非数字字母的值j--,直到i下标==j下标的值位置才返回true.

  public static boolean isNumOrCharacter(char ch) {
        if(ch >= '0' && ch <= '9' || ch >= 'a' && ch <= 'z') {
            return true;
        }
        return false;
    }
    public boolean isPalindrome(String s) {
        //
        s = s.toLowerCase();
        //1.定义i,j直到相遇
        int i = 0;
        int j = s.length() - 1;
        //2.i != j则进入循环
        while (i != j){
            //3.如果遇到非数字和字母就改变下标
            while (i < j && !isNumOrCharacter(s.charAt(i))) {//考虑越界问题
                i++;
            }
            while (i < j && !isNumOrCharacter(s.charAt(j))) {
                j--;
            }
            //4.比较当前i,j下标的值是否相等
            if (s.charAt(i) == s.charAt(j)) {
                i++;
                j--;
            }else {//5.不一样就直接没了
                return false;
            }
        }
        return true;
    }