【C语言】超详细的移位、位操作符详解(含力扣实战)

本文详细讲解了C语言中的移位操作符,包括左移(低位补0)和右移(算术右移与逻辑右移),以及位操作符如按位与、按位或和按位异或的原理。并介绍了如何在实战中运用这些操作,如不使用临时变量交换两个变量的值和利用异或找到数组中消失的数字。
### 参数说明 对于三数之和问题,函数签名通常如下所示: ```c int threeSum(int* nums, int numsSize, int** result, int* returnSize); ``` - `nums` 是输入数组。 - `numsSize` 表示输入数组的大小。 - `result` 用于存储返回的结果集,即满足条件的所有三元组组合。 - `returnSize` 返回结果集中元素的数量。 为了确保所有断言都通过[^1],程序需要验证最终得到的结果数量与预期一致,并逐项比较每个找到的三元组是否正确。 ### 实现思路 解决此问题的关键在于先对数组进行排序处理,之后利用双指针法来寻找符合条件的三个数值。具体来说,在遍历过程中固定第一个数字作为当前考虑的一部分,另外两个数字则分别从剩余部分两端向中间靠拢查找可能匹配的对象。 ### C语言实现代码 以下是完整的C语言解决方案: ```c #include <stdio.h> #include <stdlib.h> // 辅助函数:快速排序使用的比较器 static inline int compare(const void *a, const void *b) { return (*(int *)a - *(int *)b); } void threeSum(int* nums, int numsSize, int*** result, int* returnSize) { qsort(nums, numsSize, sizeof(int), compare); *returnSize = 0; if (numsSize < 3 || !nums) return; for (int i = 0; i < numsSize - 2 && nums[i] <= 0;) { if (i > 0 && nums[i] == nums[i - 1]) continue; int l = i + 1, r = numsSize - 1; while(l < r){ int sum = nums[l] + nums[r]; if(sum == (-nums[i])){ (*returnSize)++; // 动态分配内存给新的三元组并加入到结果列表中 realloc(*result, *returnSize * sizeof(**result)); (*(*result)[*returnSize - 1])[0] = nums[i]; (*(*result)[*returnSize - 1])[1] = nums[l++]; (*(*result)[*returnSize - 1])[2] = nums[r--]; // 跳过重复元素以避免冗余解 while (l < r && nums[l] == nums[l - 1]) ++l; while (r > l && nums[r] == nums[r + 1]) --r; } else if (sum < (-nums[i])) ++l; else --r; } do{ ++i; }while(i<numsSize-2&&nums[i]==nums[i-1]); } } ``` 这段代码实现了上述提到的方法论,能够有效地找出所有的不重复三元组使得它们相加等于零。注意这里假设了调用者已经为 `*result` 分配了一定的空间;实际应用时应当更加谨慎地管理动态内存分配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值