目录
leetcode136.只出现一次的数字
题目描述:
给你一个 非空 整数数组 nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [2,2,1] 输出:1
示例 2 :
输入:nums = [4,1,2,1,2] 输出:4
示例 3 :
输入:nums = [1] 输出:1
提示:
1 <= nums.length <= 3 * 104
-3 * 104 <= nums[i] <= 3 * 104
- 除了某个元素只出现一次以外,其余每个元素均出现两次。
解题思路:
因为除了某个元素只出现了以外,其余每个元素均出现了两次,所以该题可使用位运算来解决。
根据异或运算的性质:一个数与自己异或结果为0,一个数与0异或结果为它本身。
所以,可以遍历数组,将所有元素进行异或运算,最后的结果就是只出现一次的元素。
代码实现
int singleNumber(int* nums, int numsSize) {
int result = 0;
for (int i = 0; i < numsSize; i++) {
result ^= nums[i];
}
return result;
}
leetcode66.加一
题目描述:
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入:digits = [1,2,3] 输出:[1,2,4] 解释:输入数组表示数字 123。
示例 2:
输入:digits = [4,3,2,1] 输出:[4,3,2,2] 解释:输入数组表示数字 4321。
示例 3:
输入:digits = [0] 输出:[1]
提示:
1 <= digits.length <= 100
0 <= digits[i] <= 9
解题思路:
从数组的最后一个元素(即最低位)开始,逐个向前遍历数组。对于每个元素的值,比较其与9的大小。
如果当前元素的值小于9,则不需要处理进位,直接将该元素加1,并结束遍历,返回结果;
如果当前元素的值等于9,则需要处理进位,将该元素的值置为0,并继续处理前一个元素。
如果遍历完整个数组,仍然需要进位(即所有元素的值都为9),则需要在数组首位插入一个1。为此,需要创建一个新的数组,大小为digitsSize+1,并将原数组的第一个元素复制到新数组的第二个元素,往后类推。新元素的第一个元素置为1。
代码实现
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* plusOne(int* digits, int digitsSize, int* returnSize) {
int flag = 1; // 进位标志
// 从低位到高位逐个处理每个数字
for (int i = digitsSize - 1; i >= 0; i--) {
// 如果当前数字小于9,则直接将当前数字加1,并返回结果
if (digits[i] < 9) {
digits[i]++;
flag = 0;
break;
}
else {
// 如果当前数字等于9,则将当前数字置为0,并继续处理高位数字
digits[i] = 0;
}
}
// 如果所有数字都为9,则需要在数组首位插入一个1
if (flag) {
int* new_digits = (int*)malloc((digitsSize + 1) * sizeof(int));
new_digits[0] = 1;
for (int i = 1; i < digitsSize + 1; i++) {
new_digits[i] = digits[i - 1];
}
*returnSize = digitsSize + 1;
return new_digits;
}
else {
*returnSize = digitsSize;
return digits;
}
}