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

1.最长公共前缀

算法通关村第12关【黄金】| 字符串冲刺题_第1张图片

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

算法通关村第12关【黄金】| 字符串冲刺题_第2张图片

class Solution {
    public String longestCommonPrefix(String[] strs) {
        StringBuilder sb = new StringBuilder();
        for(int i = 0;i= strs[j].length()|| strs[j].charAt(i)!= c) {
                    return sb.toString();
                }
            }
            sb.append(c);
        }
        return sb.toString();
    }
}

2.压缩字符串

算法通关村第12关【黄金】| 字符串冲刺题_第3张图片

思路:使用StringBuilder

class Solution {
    public int compress(char[] chars) {
        if(chars.length == 1){
            return 1;
        }
        int count = 1;
        StringBuilder sb = new StringBuilder();
        for(int i = 0;i1){
                    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();
    }
}

双指针

class Solution {
    public int compress(char[] chars) {
        if(chars.length == 1){
            return 1;
        }
        int slow = 0;
        int fast = 0;
        for(int i = 0;i 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"]

 

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='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;
    }
}

你可能感兴趣的:(算法,算法,leetcode)