较大分组的位置-思考扎实了再动手

本文分享了编程中如何通过深入理解题目,避免盲目编码导致的错误方向,强调了读题的重要性及技巧,包括多次审题、识别关键点等,以提高代码质量和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    写了几天代码,深知想写好代码,需要训练太多东西了,有的时候确实需要过人的天赋和热情,但是我相信这个必须要到达了一定程度的时候才能体现,比如说出这句话的人一定是刷了600道题的人才有重量。

    这段时间编程发现,一开始编程的时候,根本不动脑子,没有什么战略分析,还没有摸透出题人的心思,就急于下手,最后的结果就是辛辛苦苦干了很长时间,却谬以千里,根都立错了,以后写代码的所有辛苦都是白费。

    所以之后写代码的时候,读题我就读了很多遍,即时自己以为已经懂了,还是再继续,很多题如果真正的弄明白它的巧妙点,或者是数学特征在哪里,代码量不会太大,最害怕的就是自己对这个题还没有什么特别老道的认识的时候就急于下手,代码写的又多又长,乱七八糟却根本的偏离的航向,这个时候在后期的时候调试就会遇到很多很多问题,而且都是无法解决的问题。

    读题的时候要反复的多看几遍,多看几遍你心里一定会升起一个疑问点,记住如果你看题的时候没有疑问点,或者看透出题人的心思,你往往就是没得这道题的要领,你心里升起的疑问点,往往就是接下来帮助你突破这道题的关键地方。

比如下面这道较大分组的问题:

在一个由小写字母构成的字符串 S 中,包含由一些连续的相同字符所构成的分组。

例如,在字符串 S = "abbxxxxzyy" 中,就含有 "a""bb""xxxx""z" 和 "yy" 这样的一些分组。

我们称所有包含大于或等于三个连续字符的分组为较大分组。找到每一个较大分组的起始和终止位置。

最终结果按照字典顺序输出。

示例 1:

输入: "abbxxxxzzy"
输出: [[3,6]]
解释:

"xxxx" 是一个起始于 3 且终止于 6 的较大分组

 

 

 

 

 

 

示例 2:

输入: "abc"
输出: []
解释: "a","b" 和 "c" 均不是符合要求的较大分组。

示例 3:

输入: "abcdddeeeeaabbbcd"
输出: [[3,5],[6,9],[12,14]]

说明:  1 <= S.length <= 1000

 

 

其实看这种题,我往往是先看示例中的输入和输出,然后再看题干,它会方便我们进行有针对性的模型的思考,理解起来也快。至于较大分组是什么,上面已经说清楚了,我就说我的思路。

    我先拿出一个例子:

    "abcdddeeeeaabbbcd";我专门设置了一个数组,按照字符的对应是这样的

      00001201230101200

  1. 第一次出现在对应的数组记作0,如第一个a,第二个b和第三个c
  2. 当出现重复的时候,还是第一个记作0,紧挨着的重复的数记作1,之后紧挨着的记作2,如   ddd
  3. 依次类推,eeee对应的就是0123

按照上面讲的逻辑,就可以得到上面这个数组了:00001201230101200

最大分组就是从这个数组里面找到最大的数,然后按照(这个数值的位置-这个数值)倒找到这个分组的初始位置。保存到数组里面。

即时里面有很多最大分组也可以都按照一维数组的形式保存到二维数组里面。最后返回这个二维数组。

 

 

 

    

class Solution {
    public List<List<Integer>> largeGroupPositions(String S) {
        int n=S.length();
        int []a=new int[n];
        
        
            for(int j=0;j<n;j++){
                if(j-1>=0&&S.charAt(j)==S.charAt(j-1)){                 
                    a[j]=a[j-1]+1;
              }
                else{
                    a[j]=0;
                }
                
            }
        
        
        List<List<Integer>> l=new ArrayList<List<Integer>>();
       
            for(int j=0;j<n;j++){
                if(a[j]>=2&&(j+1>=n||a[j+1]==0)){
                    int tmp=a[j];
                    ArrayList<Integer> no=new ArrayList<Integer>();
                    no.add(j-tmp);
                    no.add(j);
                    while(tmp!=0){
                        a[j-tmp]=0;
                        tmp--;
                    }
                    l.add(no);
                }
                    
        }
        return l;
        
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值