查看: 2645| 回复: 13
跳转到指定楼层
上一主题 下一主题
收起左侧

[数组] Moving zeros有思路可代码突然写不出来

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
求轻喷一个月没刷题大脑生锈了,卡了4个小时,就像按照这个思路写代码:
刚开始nums[fast]!=0就一直走,走到nums[fast]==0,把slow换到fast位置
    [4,2,4,0,0,3,0,5,1,0]
           s
             f
    fast继续走:遇到0走遇到非0就与nums[slow++]交换数值,然后fast++
    [4,2,4,3,0,0,0,5,1,0]
             s   f
    [4,2,4,3,0,0,0,5,1,0]
             s     f
    [4,2,4,3,5,0,0,0,1,0]
               s     f
    [4,2,4,3,5,1,0,0,0,0]
                 s     f
我的走进了死胡同的代码:
  1. lass Solution {
  2.     public void moveZeroes(int[] nums) {
  3.         if(nums==null || nums.length==0) return;
  4.         int slow=0,fast=0;
  5.         while(fast<nums.length-1 && slow < nums.length-1){
  6.             while(nums[fast]!=0){
  7.                 fast++;
  8.                 //中间缺点什么
  9.                 if(nums[fast]==0){
  10.                     slow=fast;
  11.                 }
  12.                
  13.             }
  14.            
  15.         }
  16.     }
  17. }
复制代码


求好心大佬帮忙,不想用for loop



补充内容 (2019-9-27 02:04):
没想到这么多大佬热心帮忙,小妹感谢不尽,是在出乎意料,大家都能帮助到正点上

上一篇:请教一道面试题
下一篇:请教一道算法题(答题加米)
推荐
JKBro 2019-9-25 07:41:44 | 只看该作者
全局:
本帖最后由 JKBro 于 2019-9-25 08:35 编辑

你是想用类似前向型指针的解法吗?其实这题两种解法都是O(n)

  1. public void MoveZeroes(int[] nums) {
  2.         if(nums == null || nums.Length < 2) return;
  3.         int slow = 0, fast = 0;
  4.         while(fast < nums.Length && slow < nums.Length){            //Find first 0
  5.             while(slow < nums.Length && nums[slow] != 0){
  6.                 slow++;
  7.             }

  8.             //Find first not 0 after first 0
  9.             if(fast <= slow){
  10.                 fast = slow + 1;
  11.             }
  12.             while(fast < nums.Length && nums[fast] == 0){
  13.                 fast++;
  14.             }

  15.             //Swap them
  16.             if(fast < nums.Length && slow < nums.Length){
  17.                 int tmp = nums[slow];
  18.                 nums[slow] = nums[fast];
  19.                 nums[fast] = tmp;
  20.                 slow++;
  21.                 fast++;
  22.             }
  23.         }
  24.     }
复制代码

回复

使用道具 举报

推荐
cszj 2019-10-1 11:07:28 | 只看该作者
全局:
本帖最后由 cszj 于 2019-10-1 11:08 编辑

可以跳过一下前面的数据
  1. void moveZones(vector<int> &va) {
  2.         int len = va.size();
  3.         int f0 = 0;
  4.         while(va[f0] != 0) f0++;
  5.         // now f0 is pointer first 0
  6.         for(int i=f0+1; i<len; i++) {
  7.                 if(va != 0) {
  8.                         swap(va, va[f0++]);
  9.                 }
  10.         }
  11.         return ;
复制代码


回复

使用道具 举报

推荐
Shen.TT 2019-9-26 04:15:47 | 只看该作者
全局:
本帖最后由 Shen.TT 于 2019-9-26 04:17 编辑

要保留非零数的顺序,所以快排不行,slow指针就对应非零数
  1. class Solution {
  2. public:
  3.     void moveZeroes(vector<int>& nums) {
  4.         int len = nums.size();
  5.         int loc = 0;
  6.         for(int i = 0;i<len;i++){
  7.             if(nums[i] != 0){
  8.                 swap(nums[i], nums[loc]);
  9.                 loc++;
  10.             }
  11.         }
  12.     }
  13. };
复制代码

[i][/i]
回复

使用道具 举报

🔗
337845818 2019-9-25 08:35:40 | 只看该作者
全局:
quicksort会写吗, 0 是你的pivot

补充内容 (2019-9-25 10:48):
https://ibb.co/7R2GwbN
回复

使用道具 举报

🔗
JKBro 2019-9-25 08:37:44 | 只看该作者
全局:
本帖最后由 JKBro 于 2019-9-25 09:02 编辑
337845818 发表于 2019-9-25 08:35
quicksort会写吗, 0 是你的pivot

说的对,我光看到楼主帖子里两个指针同方向,如果反方向就是0为pivot的quicksort
我又看了一下LC, 原题是不能改变其他数字顺序,快拍不行。Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements.

评分

参与人数 2大米 +2 收起 理由
14417335 + 1
337845818 + 1 https://ibb.co/7R2GwbN

查看全部评分

回复

使用道具 举报

🔗
337845818 2019-9-25 10:46:44 | 只看该作者
全局:
JKBro 发表于 2019-9-25 08:37
说的对,我光看到楼主帖子里两个指针同方向,如果反方向就是0为pivot的quicksort
我又看了一下LC, 原题 ...
好像图贴不出来。






补充内容 (2019-9-25 21:22):
https://ibb.co/7R2GwbN

补充内容 (2019-9-25 21:45):
不知道为什么不喜欢用for循环, 你写while一回事..
https://ibb.co/h9Cj3ys

补充内容 (2019-9-25 21:48):
@JKRro
quicksort有lomuto跟hoare两种做法了解一下
https://en.wikipedia.org/wiki/Quicksort
回复

使用道具 举报

🔗
 楼主| akdhfikbk 2019-9-27 02:01:36 | 只看该作者
全局:
JKBro 发表于 2019-9-25 07:41
你是想用类似前向型指针的解法吗?其实这题两种解法都是O(n)

[mw_shl_code=java,true] public void Move ...

这个好这个好,我自己就写不出来
哭哭
多谢大佬
回复

使用道具 举报

🔗
 楼主| akdhfikbk 2019-9-27 02:02:03 | 只看该作者
全局:
337845818 发表于 2019-9-25 08:35
quicksort会写吗, 0 是你的pivot

补充内容 (2019-9-25 10:48):

会写,但是不想这么写...
回复

使用道具 举报

🔗
 楼主| akdhfikbk 2019-9-27 02:03:07 | 只看该作者
全局:
337845818 发表于 2019-9-25 10:46
好像图贴不出来。

哈因为我现在在钻牛角尖,就像按照目前的写法写通
然后再想别的
回复

使用道具 举报

🔗
 楼主| akdhfikbk 2019-9-27 02:03:38 | 只看该作者
全局:
Shen.TT 发表于 2019-9-26 04:15
要保留非零数的顺序,所以快排不行,slow指针就对应非零数[mw_shl_code=cpp,true]class Solution {
public ...

这个还用自己写swap函数吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表