首页 > 其他分享 >LeetCode 1089. 复写零

LeetCode 1089. 复写零

时间:2023-10-24 21:32:58浏览次数:43  
标签:src arr dest 元素 1089 我们 数组 复写 LeetCode

复写零

题目链接1089. 复写零

给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

示例 1:

输入:arr = [1,0,2,3,0,4,5,0]
输出:[1,0,0,2,3,0,0,4]
解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]

示例 2:

输入:arr = [1,2,3]
输出:[1,2,3]
解释:调用函数后,输入的数组将被修改为:[1,2,3]

题目解释

解释一下题意.什么是复写0,说人话就是我们的遍历整个数组,如果我们遇到一个元素,判断这个元素.

  • 如果是0,那么新增两个0
  • 如果不是0, 直接添加

我们遍历整个数组之后,然后裁出来和原本数组长度相等的子数组就是我们的结果.

算法原理

先说一下这个题目,本来是是非常简单的,我们可以借助一个辅助数组,然后遍历我们原来的数组,下面是我们遇到的两个情况

  • 遇到的元素是 0: 新数组里面尾插两个0
  • 遇到的元素非 0: 新数组里面将这个元素尾插
int n = nums.size();
vector<int> new_num(n);
int index = 0;
for(int i = 0; i < n; ++i)
{
    if(nums[i] == 0) 
    {
        new_num[index++] = 0;
        new_num[index++] = 0;
    }
    else 
    {
         new_num[index++] = nums[i];
    }
    if(index == n) break;
}
// 将new覆盖回去就可以了

这里我们又发现一个规律,我们使用了一个辅助数组,那么是不是可以说使用双指针?可以的,但是这里存在一个情况,我们的辅助数组的p2可能会比我们原数组跑的快,那么这就是造成一个问题,我们后面的元素会被覆盖,

20231023_152633

这里我们也是可以使用双指针的,只不过我们需要从右向左走.对于原来数组的一个元素,他的目标位置有两个情况

  • 源位置和一个目标位置 这个元素非0
  • 原位置和两个目标位置 这个元素是0

下面我们遍历一边数组,根据题意的规则我们可以找到我们的目标位置达到n-1就可以了.这个解决了我们元素被覆盖的问题,但是存在下面一个问题.考虑一下下面的情况

我们dst为何可以到达下标n,这是因为我们的dst有可能跳2个位置,那么为何出现这种情况呢?一定是n-2位置的元素是0,这样他的目标位置就会覆盖后面的两个,所以我们需要解决一下.

20231023_152633_2

下面是解决的办法

if (dest == n)
{
  arr[n - 1] = 0;
  src--;
  dest -= 2;
}

代码编写

class Solution
{
public:
  void duplicateZeros(vector<int> &arr)
  {
    int src = 0;
    int dest = -1;
    int n = arr.size();
    while (src < n)
    {
      if (arr[src] != 0)
      {
        dest++;
      }
      else
      {
        dest += 2;
      }
      if (dest >= n - 1)
        break;
      src++;
    }
    if (dest == n)
    {
      arr[n - 1] = 0;
      src--;
      dest -= 2;
    }

    // 找到我们的数据并且可以将我们的src的元素赋值给我们的dest
    while (src >= 0)
    {
      if (arr[src] != 0)
      {
        arr[dest] = arr[src];
        dest--;
      }
      else
      {
        arr[dest] = arr[src];
        arr[dest - 1] = arr[src];
        dest -= 2;
      }
      src--;
    }
  }
};

标签:src,arr,dest,元素,1089,我们,数组,复写,LeetCode
From: https://blog.51cto.com/byte/8010219

相关文章

  • LeetCode 202. 快乐数
    快乐数题目链接202.快乐数编写一个算法来判断一个数n是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为1,也可能是无限循环但始终变不到1。如果这个过程结果为1,那么这个数就是快乐......
  • LeetCode 11. 盛最多水的容器
    盛水最多的容器题目链接11.盛最多水的容器给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。**说明:**你不能倾斜容器......
  • LeetCode 611. 有效三角形的个数
    有效三角形的个数题目链接611.有效三角形的个数给定一个包含非负整数的数组nums,返回其中可以组成三角形三条边的三元组个数。示例1:输入:nums=[2,2,3,4]输出:3解释:有效的组合是:2,3,4(使用第一个2)2,3,4(使用第二个2)2,2,3示例2:输入:nums=[4,2,......
  • [Leetcode] 0100. 相同的树
    100.相同的树题目描述给你两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例1:输入:p=[1,2,3],q=[1,2,3]输出:true示例2:输入:p=[1,2],q=[1,null,2]输出:false示例3:......
  • LeetCode Day13 239&347
    //利用双端队列手动实现单调队列/***用一个单调队列来存储对应的下标,每当窗口滑动的时候,直接取队列的头部指针对应的值放入结果集即可*单调队列类似(tail-->)3-->2-->1-->0(-->head)(右边为头结点,元素存的是下标)*/239. 滑动窗口最大值classSolution{......
  • LeetCode 454.四数相加 II
    题目描述给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0描述第一次提交的代码importjava.util.Map;importjava.util.HashMap;classSol......
  • [Leetcode Weekly Contest]368
    链接:LeetCode[Leetcode]2908.元素和最小的山形三元组I给你一个下标从0开始的整数数组nums。如果下标三元组(i,j,k)满足下述全部条件,则认为它是一个山形三元组:i<j<knums[i]<nums[j]且nums[k]<nums[j]请你找出nums中元素和最小的山形三元组,并返回......
  • 【LeetCode】LCP 06.拿硬币
    描述桌上有n堆力扣币,每堆的数量保存在数组coins中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数。示例输入:[4,2,1]输出:4解释:第一堆力扣币最少需要拿2次,第二堆最少需要拿1次,第三堆最少需要拿1次,总共4次即可拿完。限制1<=n<=41<=co......
  • LeetCode | 19. 删除链表的倒数第 N 个结点
    1相关标签链表、双指针、C语言2报错情况2.1题目给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。2.2错误代码/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNo......
  • LeetCode 1.两数之和
    题目描述给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例第一次提交的代码i......