力扣:1089. 复写零

这篇具有很好参考价值的文章主要介绍了力扣:1089. 复写零。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今日分享一道力扣经典题目,复写0!

题目如下:

力扣:1089. 复写零,leetcode,算法,数据结构

题目分析:

题目要求是进行复写0,而且不能超过原数组长度,且只能在原地进行操作!

解决本题最好的方法就是进行双指针方法!

算法分析

一、双指针算法先找到最后一个要复写的数

二、然后从后向前进行完成复写(因为如果要是从前向后进行复写会导致元素的覆盖!)

其中第一大步又是一个双指针的思想:再次分为了以下几步!

1.判断cur指针位置的值!

2.决定des向后移动1或2步!(如果cur的值为0则des向后移动两步,否则移动一步)!

3.判断是否达到原数组的最大长度!即(des的位置是否等于n-1)!若des已经结束,直接跳出循环!

4.若3不满足,则进行cur++操作!

5.因为最后des的位置可能是数组长度的最大值,也可能是最大值后面那个值!所以后面还需进行判断是否以及越界!若以越界,再进行修改即可!

此步骤非常重要!一定要考虑到,如若没有考虑到,那么则会导致越界的问题!

当第一大步结束时,此时des位置处于最后需要复写的最后一个位置,cur位置为最后一个复写的元素!然后最后进行从后向前完成复写即可!

画图分析:

力扣:1089. 复写零,leetcode,算法,数据结构

代码实现

C代码

void duplicateZeros(int* arr, int arrSize)
{
    //双指针!解法进行求解!
    //首先先找到最后一个复写的元素!
    int cur=0;
    int des=-1;
    while(des<arrSize)
    {
        if(arr[cur])
        {
            des++;
        }
        else if(arr[cur]==0)
        {
            des+=2;
        }
        //必须需要注意的是只要des位于最后一个位置即arrSize-1即停止循环!
        if(des>=arrSize-1)
        {
            break;
        }
        cur++;
    }

    //经过此时,cur位于最后一个复写的元素!des位于最后一个位置或者之后的位置!
    //此时需要注意的是,如果des位于n的位置是,此时已经越界!
    if(des==arrSize)
    {
        arr[arrSize-1]=0;
        des-=2;
        cur--;
    }

    while(cur>=0)
    {
        if(arr[cur]==0)
        {
            arr[des--]=0;
            arr[des--]=0;
        }
        else
        {
            arr[des]=arr[cur];
            des--;
        }
        cur--;
    }
}

c++代码

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

力扣:1089. 复写零,leetcode,算法,数据结构

今日分享到此结束!如若还有不懂,欢迎评论区留言!文章来源地址https://www.toymoban.com/news/detail-738307.html

到了这里,关于力扣:1089. 复写零的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 力扣(LeetCode)数据结构练习题(2)

    今天又写了两道关于链表的练习题,来给大家分享一下。巩固一下上一篇学到的链表知识,题目可以然我们更清楚的认识链表。 目录 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表 给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中

    2024年02月21日
    浏览(52)
  • 【数据结构】LRU缓存的简单模拟实现(leetcode力扣146LRU缓存)

    LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。 Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就需要挑选并舍弃原有的部分内容,从而腾出空间来放新内容。LRU Cache 的替换原则就是将最近最少使用的内容替换掉。

    2024年02月03日
    浏览(42)
  • 数据结构和算法的部分例题(力扣)

    1.1 合并一个数组的两个有序区间 2.1 反转单向链表 (方法1)构建一个新的链表,从就链表依次拿到每个节点,创建新的节点添加至新链表头部,完成后的新链表就是倒序的,简单,但是需要创建新的对象 (方法2)与方法1类似,构建新的链表,从头部移除节点,添加至新链

    2024年01月18日
    浏览(52)
  • 【数据结构与算法】力扣:对称二叉树

    给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root = [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root = [1,2,2,null,3,null,3] 输出:false 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/symmetric-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请

    2024年02月13日
    浏览(34)
  • 【数据结构与算法】力扣:二叉树的层序遍历

    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例1: 输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2: 输入:root = [1] 输出:[[1]] 示例 3: 输入:root = [] 输出:[] 来源:力扣(LeetCode) 链接:https://leetcode.cn/p

    2024年02月13日
    浏览(44)
  • LeetCode 1089. Duplicate Zeros

    Given a fixed-length integer array  arr , duplicate each occurrence of zero, shifting the remaining elements to the right. Note  that elements beyond the length of the original array are not written. Do the above modifications to the input array in place and do not return anything. Example 1: Example 2: Constraints: 1 = arr.length = 104 0 = arr[i] = 9 这题

    2024年02月11日
    浏览(38)
  • 【算法与数据结构】112、LeetCode路径总和

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :本题通过计算根节点到叶子节点路径上节点的值之和,然后再对比目标值。利用文章【算法和数据结构】257、LeetCode二叉树的所有路径中的递归算法。 这里要注意,默认路径之和是

    2024年02月11日
    浏览(50)
  • 【算法与数据结构】474、LeetCode一和零

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :本题要找strs数组的最大子集,这个子集最多含有 m m m 个0和 n n n 个1。本题也可以抽象成一个01背包的问题。其中,strs内的元素就是物品,而 m m m 和 n n n 就是背包的维度。 d p [

    2024年01月22日
    浏览(40)
  • 【算法与数据结构】494、LeetCode目标和

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :本题和这道题【算法与数据结构】1049、LeetCode 最后一块石头的重量 II类似,同样可以转换成01背包问题。下面开始论述。假设添加正号的整数子集和为 p o s i t i v e positive p os i t

    2024年01月20日
    浏览(41)
  • 【算法与数据结构】62、LeetCode不同路径

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :机器人只能向下或者向右移动,那么到达(i,j)位置的路径和(i-1,j)以及(i,j-1)有关。那么我们就得到的动态规划的表达式 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] dp[i][

    2024年01月18日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包