《晚安Sax》:当温柔的爵士乐声,伴你沉入静谧的梦乡

核心内容摘要

www.17com:开启你的无限可能,连接世界的数字桥梁
大雷资源:点燃无限可能,开启你的财富新纪元!

哇塞!这“瑶”味十足的体验,让我原地“翻白眼流口水流眼泪吐舌头”!

先明确核心目标这段代码要实现的功能是把一个数组里的所有 0 都移到数组末尾非 0 元素保持原来的先后顺序。

比如输入[0,1,0,3,12]→ 输出[1,3,12,0,0]。

先拆解最容易懂的部分swap 交换函数void swap(int *a, int *b) { // 定义交换函数a和b是两个整数的地址 int t *a; // *a表示取地址a里的值先把a地址的值存到临时变量t *a *b, *b t; // 把b地址的值放到a地址再把t的值放到b地址完成交换 }大白话解释你可以把int *a理解成 “一张纸条上面写着一个整数的家庭住址”*a就是 “根据这个住址找到对应的人拿到他手里的数字”整个 swap 函数就是先记下来 A 家的数字再把 B 家的数字放到 A 家最后把记下来的数字放到 B 家 → 完成两个数字的交换。

举个例子如果a是数组第 0 个元素的地址值是 0b是数组第 1 个元素的地址值是 1调用swap(a,b)后两个位置的值就变成 1 和 0 了。

重点拆解moveZeroes 核心函数双指针法先记住两个指针的 “分工”left 指针“搬运工”负责标记「下一个非 0 元素应该放到哪个位置」right 指针“侦察兵”负责遍历数组找非 0 元素。

void moveZeroes(int *nums, int numsSize) { // nums是数组地址numsSize是数组长度 int left 0, right 0; // 两个指针都从数组第0个位置最左边出发 while (right numsSize) { // 侦察兵没走到数组末尾就一直找 if (nums[right]) { // 如果侦察兵找到的元素不是0非0值在C里算真 swap(nums left, nums right); // 把这个非0元素搬到搬运工的位置 left; // 搬运工往右走一步准备接下一个非0元素 } right; // 侦察兵不管找没找到都往右走一步继续找 } }用具体例子模拟执行最关键我们用nums [0,1,0,3,12]numsSize 5来一步步走步骤right 指针位置nums [right] 值是否非 0执行操作left 指针位置数组变化100否只走 right0[0,1,0,3,12]211是交换 left (

和 right (

left11[1,0,0,3,12]320否只走 right1[1,0,0,3,12]433是交换 left (

和 right (

left12[1,3,0,0,12]5412是交换 left (

和 right (

left13[1,3,12,0,0]65-退出循环-3最终结果 [1,3,12,0,0]大白话复盘这个过程侦察兵 right 先看第 0 个位置0是 0直接往前走侦察兵到第 1 个位置1不是 0 → 喊搬运工 left在 0 位置过来交换交换后 left 走到 1 位置right 继续走侦察兵到第 2 个位置0是 0直接往前走侦察兵到第 3 个位置3不是 0 → 喊搬运工 left在 1 位置过来交换交换后 left 走到 2 位置right 继续走侦察兵到第 4 个位置12不是 0 → 喊搬运工 left在 2 位置过来交换交换后 left 走到 3 位置right 走到 5超出数组长度循环结束最终 left 指针走过的位置都是非 0 元素剩下的位置自然都是 0。

补充解释两个容易懵的点nums left是什么意思nums是数组第一个元素的地址nums left就是 “从数组开头往后数 left 个位置的地址”比如nums 0 数组第 0 个元素的地址nums 1 数组第 1 个元素的地址等价于nums[left]。

if (nums[right])为什么能判断非 0在 C 语言里布尔判断中0 假非 0不管是

1、

12 真所以if (nums[right])等价于if (nums[right] !

只是简写而已。

总结swap 函数通过 “地址” 交换两个数字核心是*符号能 “取地址里的值”双指针分工right侦察兵找非 0 元素left搬运工负责放非 0 元素核心逻辑侦察兵找到非 0 元素就和搬运工交换位置搬运工再往前走最终所有非 0 元素都被搬到左边0 自然留在右边。

先明确核心概念数组名nums的本质在 C 语言里数组名nums本身就是一个指针它指向数组第一个元素的地址可以理解成 “数组的家门牌”。

比如数组nums [0,1,0,3,12]nums→ 等价于nums[0]→ 指向第 0 个元素0的地址nums[0]→ 取第 0 个元素的值0nums[1]→ 取第 1 个元素的值1。

关键nums left是什么nums left是指针的算术运算意思是从数组的起始地址nums往后 “走left步”指向数组第left个元素的地址。

等价于nums[left]是取地址符号比如left0→nums0nums[0]第 0 个元素地址比如left1→nums1nums[1]第 1 个元素地址比如left2→nums2nums[2]第 2 个元素地址。

结合代码场景理解代码里调用swap(nums left, nums right)本质是拿到nums数组中第left个元素的地址numsleft拿到nums数组中第right个元素的地址numsright把这两个地址传给swap函数交换这两个地址对应的值。

用具体例子落地还是用nums [0,1,0,3,12]当left

right1时nums leftnums0nums[0]→ 第 0 个元素0的地址nums rightnums1nums[1]→ 第 1 个元素1的地址调用swap后这两个地址的值被交换数组变成[1,0,0,3,12]。

再比如left

right3时nums1nums[1]值为 0nums3nums[3]值为 3交换后数组变成[1,3,0,0,12]。

为什么不用nums[left]反而用numsleft两者效果完全一样只是写法不同nums[left]是 “数组下标写法”更直观新手容易懂numsleft是 “指针算术写法”是 C 语言更底层的写法很多程序员习惯这么写你把代码里的numsleft换成nums[left]功能完全不变。

总结nums left等价于nums[left]都是取数组第left个元素的地址传给swap函数的必须是 “地址”指针因为swap需要通过地址修改原数组的值指针算术numsleft的核心是从数组起始地址往后偏移left个元素的位置。

魅影my53tv下载安装教程-魅影my53tv下载安装教程应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123