力扣字符串练习题(最后一个单词的长度、有效数字)

124 阅读3分钟

最后一个单词的长度

来源:力扣(LeetCode) 链接:leetcode.cn/problems/le…

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。

单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。

示例 1:

输入:s = "Hello World"

输出:5

解释:最后一个单词是“World”,长度为5。

示例 2:

输入:s = "   fly me   to   the moon  "

输出:4

解释:最后一个单词是“moon”,长度为4。

示例 3:

输入:s = "luffy is still joyboy"

输出:6

解释:最后一个单词是长度为6的“joyboy”。

提示:

  • 1 <= s.length <= 104
  • s 仅有英文字母和空格 ' ' 组成
  • s 中至少存在一个单词

代码

class Solution {
    public int lengthOfLastWord(String s) {
        s = s.trim(); // 去除字符串首尾的空格
        int length = 0;
        for (int i = s.length() - 1; i >= 0; i--) {
            if (s.charAt(i) == ' ') {
                break; // 遇到空格就结束循环
            }
            length++;
        }
        return length;
    }
}

思路分析

  1. 使用trim()函数去除字符串s首尾的空格,得到一个新的字符串。
  2. 初始化一个变量length为0,用于记录最后一个单词的长度。
  3. 从字符串的末尾开始遍历,使用一个循环,从索引s.length() - 1到0。
  4. 在循环中,判断当前字符是否为空格。如果是空格,则跳出循环,因为已经找到最后一个单词的末尾。
  5. 如果不是空格,将length加1。
  6. 最终返回length,即最后一个单词的长度。

有效数字

来源:力扣(LeetCode) 链接:leetcode.cn/problems/va…

有效数字(按顺序)可以分成以下几个部分:

  1. 一个 小数 或者 整数
  2. (可选)一个 'e' 或 'E' ,后面跟着一个 整数

小数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符('+' 或 '-')
  2. 下述格式之一:
  • 至少一位数字,后面跟着一个点 '.'
  • 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
  • 一个点 '.' ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符('+' 或 '-')
  2. 至少一位数字

部分有效数字列举如下:["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]

部分无效数字列举如下:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]

给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。

示例 1:

输入:s = "0"

输出:true

示例 2:

输入:s = "e"

输出:false

示例 3:

输入:s = "."

输出:false

提示:

  • 1 <= s.length <= 20
  • s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,或者点 '.' 。

代码

class Solution {
    public boolean isNumber(String s) {
        s = s.trim();
        boolean isNumber = false;
        boolean hasE = false;
        boolean hasDot = false;
        boolean hasDigit = false;
        
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            
            if (Character.isDigit(c)) {
                isNumber = true;
                hasDigit = true;
            } else if (c == '+' || c == '-') {
                if (i > 0 && s.charAt(i - 1) != 'e' && s.charAt(i - 1) != 'E') {
                    return false;
                }
            } else if (c == 'e' || c == 'E') {
                if (hasE || !hasDigit) {
                    return false;
                }
                hasE = true;
                isNumber = false;
                hasDigit = false;
            } else if (c == '.') {
                if (hasDot || hasE) {
                    return false;
                }
                hasDot = true;
            } else {
                return false;
            }
        }
        
        return isNumber && hasDigit;
    }
}

思路分析

  1. 使用trim()函数去除字符串s首尾的空格,得到一个新的字符串。
  2. 初始化一些布尔变量:isNumber表示是否为数字,hasE表示是否包含'e'或'E',hasDot表示是否包含小数点,hasDigit表示是否包含数字。
  3. 使用一个循环遍历字符串s的每个字符。
  4. 如果当前字符是数字,将isNumber设置为true,并将hasDigit设置为true。
  5. 如果当前字符是'+'或'-',则需判断它们的位置是否合法。如果该符号不是出现在字符串的开头或紧接在'e'或'E'之后,则返回false。
  6. 如果当前字符是'e'或'E',则需判断它的位置是否合法。如果已经出现过'e'或'E',或者当前还没有出现过数字,则返回false。将hasE设置为true,并重置isNumberhasDigit为false,因为'e'或'E'后面必须跟着一个数字。
  7. 如果当前字符是小数点'.',则需判断它的位置是否合法。如果已经出现过小数点或'e'或'E',则返回false。将hasDot设置为true。
  8. 如果当前字符不是合法的数字字符,直接返回false。
  9. 循环结束后,判断最终的结果:isNumber必须为true,且至少要有一个数字出现。
  10. 返回最终的结果。