算法通关村第12关【黄金】| 字符串冲刺题

1.最长公共前缀

思路:纵向比较,每个字符串从头挨个比较

java 复制代码
class Solution {
    public String longestCommonPrefix(String[] strs) {
        StringBuilder sb = new StringBuilder();
        for(int i = 0;i<strs[0].length();i++){
            char c = strs[0].charAt(i);
            for(int j = 1;j<strs.length;j++){
                if(i >= strs[j].length()|| strs[j].charAt(i)!= c) {
                    return sb.toString();
                }
            }
            sb.append(c);
        }
        return sb.toString();
    }
}

2.压缩字符串

思路:使用StringBuilder

java 复制代码
class Solution {
    public int compress(char[] chars) {
        if(chars.length == 1){
            return 1;
        }
        int count = 1;
        StringBuilder sb = new StringBuilder();
        for(int i = 0;i<chars.length;i++){
            if(i == chars.length - 1){
                sb.append(chars[i]);
                if(count>1){
                    sb.append(count);
                }
                break;
            }
            if(chars[i] != chars[i+1]){
                sb.append(chars[i]);
                if(count>1){
                    sb.append(count);
                }
                count = 0;
            }
            count++;
        }
        char[] cs = new String(sb).toCharArray();
        int i = 0;
        for(char c : cs){
            chars[i] = c;
            i++;
        }
        return sb.length();
    }
}

双指针

java 复制代码
class Solution {
    public int compress(char[] chars) {
        if(chars.length == 1){
            return 1;
        }
        int slow = 0;
        int fast = 0;
        for(int i = 0;i<chars.length;i++){
            if(i == chars.length - 1 || chars[i] != chars[i + 1]) {
                chars[fast++] = chars[i];
                int num = i - slow + 1;
                if (num > 1) {
                    int anchor = fast;
                    while (num > 0) {
                        chars[fast++] = (char)(num % 10 + '0');
                        num /= 10;
                    }
                    reverse(chars, anchor,fast - 1);
                }
                slow = i + 1;
            }
        }
        return fast;
    }
    public void reverse(char[] chars, int left, int right) {
        while (left < right) {
            char temp = chars[left];
            chars[left] = chars[right];
            chars[right] = temp;
            left++;
            right--;
        }
    }

}

3.表示数值的字符串

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

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

  1. 若干空格
  2. 一个 小数 或者 整数
  3. (可选)一个 'e''E' ,后面跟着一个 整数
  4. 若干空格

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

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

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

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

部分数值列举如下:

  • ["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]

部分非数值列举如下:

  • ["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
java 复制代码
class Solution {
    public boolean isNumber(String s) {
        if(s == null||s.length() == 0){
            return false;
        }
        char[] str = s.trim().toCharArray();
        if(str.length == 0){
            return false;
        }
        boolean isDot = false;
        boolean isE = false;
        boolean isSign = false;
        boolean isNum = false;
        int i = 0;
        // System.out.print(str.length);
        for(i = 0;i<str.length;i++){
            if(str[i]>='0'&&str[i]<='9'){
                isNum = true;
            }else if(str[i] == '.'){
                if(isDot || isE){
                    return false;
                }
                isDot = true;
                isE = false;
            }else if(str[i] == 'e'||str[i] == 'E'){
                if(isE || !isNum){
                    return false;
                }
                isE = true;
                isNum = false;
                isSign = false;
            }else if(str[i] == '+'||str[i] == '-'){
                if(i!= 0 && str[i-1] != 'e' && str[i-1] != 'E'){
                    return false;
                }
                isSign = true;
            }else{
                return false;
            }
        }
        return isNum;
    }
}
相关推荐
fancy1661661 小时前
力扣top100 矩阵置零
人工智能·算法·矩阵
小南家的青蛙1 小时前
LeetCode面试题 01.09 字符串轮转
java·leetcode
元亓亓亓1 小时前
LeetCode热题100--240.搜索二维矩阵--中等
算法·leetcode·矩阵
明月看潮生2 小时前
青少年编程与数学 02-019 Rust 编程基础 09课题、流程控制
开发语言·算法·青少年编程·rust·编程与数学
oioihoii2 小时前
C++23 views::slide (P2442R1) 深入解析
linux·算法·c++23
yuhao__z3 小时前
代码随想录算法训练营第六十三天| 图论9—卡码网47. 参加科学大会,94. 城市间货物运输 I
算法·图论
June`3 小时前
专题三:穷举vs暴搜vs深搜vs回溯vs剪枝(全排列)决策树与递归实现详解
c++·算法·深度优先·剪枝
vlln3 小时前
适应性神经树:当深度学习遇上决策树的“生长法则”
人工智能·深度学习·算法·决策树·机器学习
冲帕Chompa4 小时前
图论part09dijkstra算法
算法·图论
·云扬·4 小时前
【PmHub后端篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现
redis·算法·lua