飞不高 发表于 2025-1-21 06:17:30

【优选算法篇】2----复写零

---------------------------------------begin---------------------------------------

这道算法题相对于移动零,就上了一点点强度咯,不过照旧很容易理解的啦~
题目解析:

https://i-blog.csdnimg.cn/direct/049d7bb0f9c44b128d86777cbbfe2ee0.png
这道题如果没理解好题目,是很难的,但理解题目就容易啦

讲解算法原理:

意思就是:一个数组长度是固定的,里面的元素,只要是0,就须要在原有的基础上,在0的后面多加一个0,以此类推,不为0的数就得今后移动,最后保持原有的数组长度不变,像上图第一个示例的5和0就是因为前面0要写两个,所以要被去掉~

编写代码:

class Solution
{
public:
    void duplicateZeros(vector<int>& arr)
    {
      int cur = 0, dest = -1;
      int n = arr.size();
      while (cur < n)
      {
            if (arr)
                dest++;
            else
                dest += 2;
            if (dest >= n - 1)
                break;
            cur++;
      }
      if (dest == n)
      {
            arr = 0;
            cur--;
            dest -= 2;
      }
      while (cur >= 0)
      {
            if (arr)
            {
                arr = arr;
            }
            else
            {
                arr = 0;
                arr = 0;
                cur--;
            }
      }
    }
};    我这里实现主要是先遍历一遍数组,如果arr【cur】为非0,则dest走一步,cur++,如果为0,dest则走两步,直到dest到达最后一位,则break,此时cur的位置则为0复写后数组的最后一位数。
注意:在这里须要注意越界题目,如下图:
https://i-blog.csdnimg.cn/direct/3f43a91980a44bb19cd09547ee8c7976.png
有一个0越界,直接n-1位置变为0,然后cur--,dest-=2即可!!!

------------------------------------end--------------------------------------------


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【优选算法篇】2----复写零