算法通关村第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;
    }
}
相关推荐
xiaobaibai1534 分钟前
智慧交通中目标检测 mAP↑28%:陌讯多模态融合算法实战解析
人工智能·算法·目标检测·计算机视觉·目标跟踪·视觉检测
战争热诚12 分钟前
基于transformer的目标检测——匈牙利匹配算法
算法·目标检测·transformer
计算机科研圈17 分钟前
ICCV 2025 | EPD-Solver:西湖大学发布并行加速扩散采样算法
人工智能·算法·语言模型·自然语言处理·数据挖掘·iccv
Yzxs0091 小时前
【8月优质EI会议合集|高录用|EI检索稳定】计算机、光学、通信技术、电子、建模、数学、通信工程...
大数据·人工智能·算法·计算机视觉·信息与通信
佳航张2 小时前
选择排序原理与C语言实现详解
算法
hans汉斯2 小时前
【建模与仿真】二阶邻居节点信息驱动的节点重要性排序算法
人工智能·python·算法·分类·数据挖掘·排序算法·xca
不会学习的小白O^O2 小时前
蛇形卷积介绍
算法
nov.5812 小时前
嵌入式学习日志——数据结构(一)
数据结构·学习·算法
橙小花3 小时前
C语言:函数指针、二级指针、常量指针常量、野指针
c语言·数据结构·算法
西猫雷婶4 小时前
python学智能算法(三十一)|SVM-Slater条件理解
人工智能·python·算法·机器学习·支持向量机