算法日志 --- 12.06---字符串中不同整数的数目

76 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

今天要验收了,单独部署的工程

字符串中不同整数的数目

该题出自力扣的1805题 —— 字符串中不同整数的数目【简单题】

审题

给你一个字符串 word ,该字符串由数字和小写英文字母组成。 请你用空格替换每个不是数字的字符。例如,"a123bc34d8ef34" 将会变成 " 123  34 8  34" 。注意,剩下的这些整数为(相邻彼此至少有一个空格隔开):"123"、"34"、"8" 和 "34" 。 返回对 word 完成替换后形成的 不同 整数的数目。 只有当两个整数的 不含前导零 的十进制表示不同, 才认为这两个整数也不同。

  • 今天这是一道简单题,虽然是简单题,但是容易阴沟里翻船,错了几次
    • 给出一个字符串,返回字符串呢不同整数的数目
    • 字符串由字母和数字组成,需要对字符串内的字母进行过滤
  • 一开始是打算使用暴力遍历的,没想到用了Long型的数据结构,还是被长度100的纯数字击败
  • 最终使用set的集合,作为查重的兜底
    • 把字符串转化成字符的数组,可以对性能更为方便
    • 遍历字符串
      • 如果是当前坐标小于长度,并且不属于数字的话,直接跳过
      • 做一个兜底的判断,如果当前下标大于长度的话,直接跳出循环返回
      • 判断数字的起始与末尾下标,最终利用起始坐标对字符串进行分割
      • 对数字的前导零进行处理,去除前导零

编码

class Solution {
   public int numDifferentIntegers(String word) {
       Set<String> set = new HashSet<>();
       int n = word.length(),p2 = 0;
       char[] chars = word.toCharArray();
       for (int i = 0; i < n; i++) {
           while (i < n && !Character.isDigit(chars[i])){
               i++;
           }
           if (i>= n)break;
           p2 = i;
           while (p2 < n && Character.isDigit(chars[p2])){
               p2++;
           }
           while (p2 -i > 1 && chars[i] == '0'){
               i++;
           }
           set.add(word.substring(i,p2));
           i = p2;
       }
       return set.size();
   }
}

image.png