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


    1.最长公共前缀

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

    1. class Solution {
    2. public String longestCommonPrefix(String[] strs) {
    3. StringBuilder sb = new StringBuilder();
    4. for(int i = 0;i0].length();i++){
    5. char c = strs[0].charAt(i);
    6. for(int j = 1;j
    7. if(i >= strs[j].length()|| strs[j].charAt(i)!= c) {
    8. return sb.toString();
    9. }
    10. }
    11. sb.append(c);
    12. }
    13. return sb.toString();
    14. }
    15. }

    2.压缩字符串

    思路:使用StringBuilder

    1. class Solution {
    2. public int compress(char[] chars) {
    3. if(chars.length == 1){
    4. return 1;
    5. }
    6. int count = 1;
    7. StringBuilder sb = new StringBuilder();
    8. for(int i = 0;i
    9. if(i == chars.length - 1){
    10. sb.append(chars[i]);
    11. if(count>1){
    12. sb.append(count);
    13. }
    14. break;
    15. }
    16. if(chars[i] != chars[i+1]){
    17. sb.append(chars[i]);
    18. if(count>1){
    19. sb.append(count);
    20. }
    21. count = 0;
    22. }
    23. count++;
    24. }
    25. char[] cs = new String(sb).toCharArray();
    26. int i = 0;
    27. for(char c : cs){
    28. chars[i] = c;
    29. i++;
    30. }
    31. return sb.length();
    32. }
    33. }

    双指针

    1. class Solution {
    2. public int compress(char[] chars) {
    3. if(chars.length == 1){
    4. return 1;
    5. }
    6. int slow = 0;
    7. int fast = 0;
    8. for(int i = 0;i
    9. if(i == chars.length - 1 || chars[i] != chars[i + 1]) {
    10. chars[fast++] = chars[i];
    11. int num = i - slow + 1;
    12. if (num > 1) {
    13. int anchor = fast;
    14. while (num > 0) {
    15. chars[fast++] = (char)(num % 10 + '0');
    16. num /= 10;
    17. }
    18. reverse(chars, anchor,fast - 1);
    19. }
    20. slow = i + 1;
    21. }
    22. }
    23. return fast;
    24. }
    25. public void reverse(char[] chars, int left, int right) {
    26. while (left < right) {
    27. char temp = chars[left];
    28. chars[left] = chars[right];
    29. chars[right] = temp;
    30. left++;
    31. right--;
    32. }
    33. }
    34. }

    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"]

     

    1. class Solution {
    2. public boolean isNumber(String s) {
    3. if(s == null||s.length() == 0){
    4. return false;
    5. }
    6. char[] str = s.trim().toCharArray();
    7. if(str.length == 0){
    8. return false;
    9. }
    10. boolean isDot = false;
    11. boolean isE = false;
    12. boolean isSign = false;
    13. boolean isNum = false;
    14. int i = 0;
    15. // System.out.print(str.length);
    16. for(i = 0;i
    17. if(str[i]>='0'&&str[i]<='9'){
    18. isNum = true;
    19. }else if(str[i] == '.'){
    20. if(isDot || isE){
    21. return false;
    22. }
    23. isDot = true;
    24. isE = false;
    25. }else if(str[i] == 'e'||str[i] == 'E'){
    26. if(isE || !isNum){
    27. return false;
    28. }
    29. isE = true;
    30. isNum = false;
    31. isSign = false;
    32. }else if(str[i] == '+'||str[i] == '-'){
    33. if(i!= 0 && str[i-1] != 'e' && str[i-1] != 'E'){
    34. return false;
    35. }
    36. isSign = true;
    37. }else{
    38. return false;
    39. }
    40. }
    41. return isNum;
    42. }
    43. }

  • 相关阅读:
    【ELM预测】基于matlab探路者算法优化极限学习机预测(含前后对比)【含Matlab源码 2204期】
    网络卡顿怎么办?快来试试华为云CDN
    【UnityUGUI】复合控件详解,你还记得多少
    leetcode 10. 正则表达式匹配
    1786_MTALAB代码生成把通用函数生成独立文件
    数据结构和算法 IV
    【工作流引擎】Activiti的使用03
    微信建行支付对接
    AI免费写作工具,怎么选择AI免费写作工具
    System design summary
  • 原文地址:https://blog.csdn.net/Candy___i/article/details/132732335