网易首页 > 网易号 > 正文 申请入驻

2026-08-28:将 0 移到末尾的最少交换次数。用go语言,有一个整数数组,每次可以任选两个不同位置,交换这两个位置上的数字。现在想用尽

0
分享至

2026-08-28:将 0 移到末尾的最少交换次数。用go语言,有一个整数数组,每次可以任选两个不同位置,交换这两个位置上的数字。现在想用尽量少的交换次数,让数组中所有的 0 都集中到数组末尾,非零数字全部移到 0 的前面。

可以先数出一共有多少个 0,记为 c;再查看数组最后 c 个位置里有多少个非零数字,这个数量就是最少需要的交换次数。

1 <= nums.length <= 100。

0 <= nums[i] <= 100。

输入: nums = [0,1,0,3,12]。

输出: 2。

解释:

我们执行以下交换操作:

交换 nums[0] 和 nums[3] ,得到 nums = [3, 1, 0, 0, 12] 。

交换 nums[2] 和 nums[4] ,得到 nums = [3, 1, 12, 0, 0] 。

因此,答案是 2 。

题目来自力扣3936。

大体执行过程

  1. 1.初始化阶段

  • • 左指针l指向数组开头,即下标0。

  • • 右指针r指向数组末尾,即下标len(nums)-1。

  • • 交换次数ans初始为0。

2.循环扫描阶段
只要左指针l仍然小于右指针r,就反复检查当前左右指针指向的数字:

  • •情况一:左边不是 0
    如果nums[l] != 0,说明当前左指针位置已经符合“非零数字在前”的要求。
    此时不需要交换,直接把左指针右移一位,继续看下一个位置。

  • •情况二:左边是 0,但右边也是 0
    如果nums[l] == 0且nums[r] == 0,说明当前右指针位置已经符合“0 在末尾”的要求。
    此时也不需要交换,直接把右指针左移一位,继续寻找右边可能存在的非零数字。

  • •情况三:左边是 0,右边是非 0
    这是真正需要处理的错配情况。
    左边的这个 0 应该移动到后面,右边的这个非 0 应该移动到前面。
    因此需要一次交换,交换次数ans加一。
    交换后,这两个位置就都变得合理了,所以左指针右移一位,右指针左移一位,继续处理中间未处理的部分。

3.结束条件
当左指针和右指针相遇或交错时,说明整个数组已经被逻辑上划分好:

  • • 左边部分都是非零数字;

  • • 右边部分都是 0。
    循环结束,返回累计的交换次数ans。

为什么代码中没有真正交换数组元素也可以

在这段代码里,虽然注释写了“交换”,但实际上并没有修改原数组,只增加了ans。
这是因为我们只关心最少交换次数,而不需要真正返回交换后的数组。
每当遇到“左边 0、右边非 0”的情况,就把它记作一次有效交换,然后两个指针都向中间收缩,已经处理过的位置之后不会再访问,所以不真正写回数组也不会影响后面的计数。

与题目描述中“数最后 c 个位置里的非零个数”的关系

题目描述给出的方法是:
先统计数组中一共有多少个 0,记为c,然后看数组最后c个位置中有多少个非零数字,这个数量就是答案。

双指针的做法和这个思路是等价的:

  • • 数组中最终末尾的 0 的个数是固定的,记为c。

  • • 数组最后c个位置中如果有k个非零数字,那么这k个非零数字每一个都需要被交换到前面去。

  • • 每交换一次,最多只能把一个非零数字从末尾区域移出。

  • • 所以最少交换次数就是k。

双指针每次找到一个“左边 0、右边非 0”的组合并计数,实际上就是在逐个把这些末尾区域的非零数字与前面的 0 配对交换。因此它统计出来的次数正好等于最后c个位置中的非零数字个数。

示例流程

以nums = [0,1,0,3,12]为例:

  • • 初始:l = 0,r = 4,ans = 0。

  • •nums[0] = 0,nums[4] = 12非 0,属于情况三。
    记录一次交换,ans = 1,l移到1,r移到3。

  • •nums[1] = 1非 0,属于情况一。
    l右移到2。

  • •nums[2] = 0,nums[3] = 3非 0,属于情况三。
    再记录一次交换,ans = 2,l移到3,r移到2。

  • • 此时l >= r,循环结束,返回2。

复杂度分析
  • •时间复杂度:
    每次循环至少会让左指针右移一位,或者右指针左移一位,最多扫描整个数组一次。
    因此总时间复杂度为O(n),其中n是数组长度。

  • •额外空间复杂度:
    只使用了左指针、右指针和答案计数等有限几个变量,没有开辟与数组长度相关的额外空间。
    因此额外空间复杂度为O(1)。

Go完整代码如下:

package main

import (
"fmt"
)

func minimumSwaps(nums []int) (ans int) {
l, r := 0, len(nums)-1
for l < r {
if nums[l] != 0 {
l++
} else if nums[r] == 0 {
r--
} else {
// 交换 nums[l] 和 nums[r]
ans++
l++
r--
}
}
return
}

func main() {
nums := []int{0, 1, 0, 3, 12}
result := minimumSwaps(nums)
fmt.Println(result)
}

Python完整代码如下:

# -*-coding:utf-8-*-

from typing import List

def minimumSwaps(nums: List[int]) -> int:
ans = 0
l, r = 0, len(nums) - 1
while l < r:
if nums[l] != 0:
l += 1
elif nums[r] == 0:
r -= 1
else:
# nums[l] == 0 且 nums[r] != 0,需要一次交换
ans += 1
l += 1
r -= 1
return ans

if __name__ == "__main__":
nums = [0, 1, 0, 3, 12]
result = minimumSwaps(nums)
print(result)

C++完整代码如下:

  


using namespace std;

int minimumSwaps(vector& nums) {
int ans = 0;
int l = 0, r = (int)nums.size() - 1;
while (l < r) {
if (nums[l] != 0) {
l++;
} else if (nums[r] == 0) {
r--;
} else {
// nums[l] == 0 且 nums[r] != 0,需要一次交换
ans++;
l++;
r--;
}
}
return ans;
}

int main() {
vector nums = {0, 1, 0, 3, 12};
int result = minimumSwaps(nums);
cout << result << endl;
return 0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
男子参加喝酒挑战赛,26分钟喝完15斤啤酒进ICU,获5000元奖金;商家拒付3万余元医药费,男子报警后未被立案

男子参加喝酒挑战赛,26分钟喝完15斤啤酒进ICU,获5000元奖金;商家拒付3万余元医药费,男子报警后未被立案

都市快报橙柿互动
2026-10-13 14:33:39
又一电诈头目落网!坑害国人超27亿,杀人不眨眼,全网呼吁查赵薇

又一电诈头目落网!坑害国人超27亿,杀人不眨眼,全网呼吁查赵薇

泪满过眼
2026-10-10 07:24:15
许志安复出开演唱会,给所有艺人都上了一课

许志安复出开演唱会,给所有艺人都上了一课

情感大头说说
2026-10-12 15:05:40
国家未出一分钱,为何农村私人祖传宅基地成了村集体的呢

国家未出一分钱,为何农村私人祖传宅基地成了村集体的呢

游文刀
2026-10-12 01:25:48
4-1!48岁兰帕德激动挥拳 率升班马从4连败到2连胜 积分追平曼联

4-1!48岁兰帕德激动挥拳 率升班马从4连败到2连胜 积分追平曼联

我爱英超
2026-10-13 07:08:07
乌克兰委曲求全,暂停袭击俄罗斯炼油厂

乌克兰委曲求全,暂停袭击俄罗斯炼油厂

名人苟或
2026-10-13 15:58:58
性专家说:当一个异性开口跟你要钱,要礼物,不管对方是不是想试探你的真心,你都应该明白,你已被对方列入供养者行列

性专家说:当一个异性开口跟你要钱,要礼物,不管对方是不是想试探你的真心,你都应该明白,你已被对方列入供养者行列

心理观察局
2026-08-05 06:46:04
23岁中国短跑名将突然宣布退役,曾参加巴黎奥运会,杭州亚运会摘金

23岁中国短跑名将突然宣布退役,曾参加巴黎奥运会,杭州亚运会摘金

米修体育
2026-10-12 18:05:54
田晨光任通辽市代市长 奇·达楞太辞去市长职务

田晨光任通辽市代市长 奇·达楞太辞去市长职务

中国经济网
2026-10-13 11:25:17
黄珊珊34万票影响台北市长选举战局?本人发声:他们是决定胜负的一群

黄珊珊34万票影响台北市长选举战局?本人发声:他们是决定胜负的一群

海峡导报社
2026-10-13 11:34:02
申请金卡也没用,美国告TP-Link假脱钩,搬去越南后,路由器里只有0.5%是越南零部件

申请金卡也没用,美国告TP-Link假脱钩,搬去越南后,路由器里只有0.5%是越南零部件

王新喜
2026-10-12 19:10:22
人民日报点名!16岁饭圈女孩被抓,舆论矛头直指王楚钦,大V喊话

人民日报点名!16岁饭圈女孩被抓,舆论矛头直指王楚钦,大V喊话

失宠的小野猪
2026-10-13 15:49:10
公路车骑行服,熟女骑行穿搭,利落面料勾勒饱满曲线

公路车骑行服,熟女骑行穿搭,利落面料勾勒饱满曲线

只要高兴就好
2026-09-24 11:58:50
“这拿筷子姿势,太恶心了”,一段母女吃饭视频火了,又一个贫民窟的小公主

“这拿筷子姿势,太恶心了”,一段母女吃饭视频火了,又一个贫民窟的小公主

蝴蝶花雨话教育
2026-10-06 11:47:56
当年沙俄割走中国150万平方公里土地,这笔账中国人记了一百多年;可如今画风一转 —— 俄罗斯的油,走中国的管道;

当年沙俄割走中国150万平方公里土地,这笔账中国人记了一百多年;可如今画风一转 —— 俄罗斯的油,走中国的管道;

回京历史梦
2026-10-13 09:23:50
“找搭子”暗藏灰色交易:酒托、旅游托设局消费,24瓶啤酒收938元;有偿陪伴用“纯绿、半绿”暗语引流,有客服称有500多名“小姐姐”可选

“找搭子”暗藏灰色交易:酒托、旅游托设局消费,24瓶啤酒收938元;有偿陪伴用“纯绿、半绿”暗语引流,有客服称有500多名“小姐姐”可选

大风新闻
2026-10-12 09:35:03
五千万啃光!马蓉从阔太沦落澳洲超市夜班,出门捂脸不敢见人

五千万啃光!马蓉从阔太沦落澳洲超市夜班,出门捂脸不敢见人

皮蛋儿电影
2026-05-14 09:59:14
学校里出现了非常危险的现象:越来越多的孩子可能已经“脑腐”了

学校里出现了非常危险的现象:越来越多的孩子可能已经“脑腐”了

米果说识
2026-10-13 12:04:17
当6.5%的人拿走四成:一张养老金账单背后的制度追问

当6.5%的人拿走四成:一张养老金账单背后的制度追问

金融科技一线
2026-10-10 08:53:24
两性关系:发现了没,寿命长的男人,大多都有这五个好习惯

两性关系:发现了没,寿命长的男人,大多都有这五个好习惯

荔子言
2026-09-08 14:55:50
2026-10-13 16:59:00
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1511文章数 83关注度
往期回顾 全部

科技要闻

扎克伯格宣布追上OpenAI!Meta新模型亮相

头条要闻

33岁销冠确诊胃癌晚期后突然被辞退:只剩10个月生命

头条要闻

33岁销冠确诊胃癌晚期后突然被辞退:只剩10个月生命

体育要闻

走调的歌声里全是感情 最好的郑钦文尚未登场

娱乐要闻

谭松韵亲自解答兰香结局遗憾

财经要闻

"黑医师"产业链调查:不学医竟能"拿证"

汽车要闻

平台可以共享 设计不能趋同:Stellantis的六个新答案

态度原创

游戏
家居
时尚
艺术
本地

曝任天堂发布会明天公布!老任牌太多 第三方纷至沓来

家居要闻

2026建博会(广州) 公装联探展交流活动

彩毛衣+小黑裤,超显气色的!

艺术要闻

荒了30年!广东最奢华的烂尾楼,像末日城堡,废墟氛围感绝了

本地新闻

这个十一,林都伊春彻底出圈!

无障碍浏览 进入关怀版