算法通关村第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;
    }
}
相关推荐
鸽鸽程序猿9 分钟前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd9 分钟前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo61713 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v18 分钟前
leetCode43.字符串相乘
java·数据结构·算法
A懿轩A1 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
古希腊掌管学习的神1 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
云边有个稻草人1 小时前
【优选算法】—复写零(双指针算法)
笔记·算法·双指针算法
半盏茶香1 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
忘梓.2 小时前
解锁动态规划的奥秘:从零到精通的创新思维解析(3)
算法·动态规划
tinker在coding4 小时前
Coding Caprice - Linked-List 1
算法·leetcode