青训营X豆包MarsCode 技术训练营第一课 | 豆包MarsCode AI 刷题

84 阅读2分钟

小F是一个好学的中学生,今天他学习了数列的概念。他在纸上写下了一个由 0 和 1 组成的正整数序列,长度为 n。这个序列中的 1 和 0 交替出现,且至少由 3 个连续的 0 和 1 组成的部分数列称为「神奇数列」。例如,10101 是一个神奇数列,而 1011 不是。现在,小F想知道在这个序列中,最长的「神奇数列」是哪一个。你能帮他找到吗?

这是AI刷题的一题,我们可以用暴力法解,即从头到尾遍历字符串,这个不再赘述; 也可以用双指针法去解,双指针法的直观想法很简单:

使用一个快指针和一个慢指针遍历数组

快指针的职责:往后遍历新数组元素,相当于工作指针

慢指针的职责:原地更新数组的数据构成,帮助快指针实现数组重复元素覆盖的工作

在这题中,2个指针分别指向嫌疑神奇序列的左端和右端,右端指针如果察觉到右边的数字仍然满足条件(数字交替),则继续往右边扩展。如果不满足条件,左右指针会进行更新,寻找新的嫌疑神奇序列。

由于题目涉及到“最大”,所以搜索期间需要用maxlen和一个maxstring来记录当前最长的神奇序列。

需要注意的是当j遍历到最后一个元素时,maxlen和maxstring还没来得及保存就跳出循环了,所以需要在while循环结束时再检查一下。

public static String solution (String inp) {

    if(inp.length()<2)
        return "";
    int i=0;
    int j=i+1;
    //遍历一遍
    int mlen=Integer.MIN_VALUE;
    String res="";
    int len=1;
    
    while(j<inp.length())
    {
        if(inp.charAt(j) != inp.charAt(j-1))
        {
            len++;
            j++;
        }
        else
        {
            //先保存现有结果
            if(mlen<len && len>=3)
            {
                mlen=len;
                res=inp.substring(i, j);
            }
            //重新开始
            len=1;
            i=j;
            j=i+1;
        }
    }
    
    //处理最后一个元素
    if(mlen < len&&len>=3) {
        mlen = len;
        res = inp.substring(i, j);
    }
    return res;

}

力扣上还有其他相关的题,如:

1、给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。

2、给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

3、给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。