一:不用加减乘除做加法_牛客题霸_牛客网 (nowcoder.com)
一刷不理解,准备以后二刷。
刷题总结:读题的时候要先找出题目的全部条件,如果题目比较复杂可以一条一条的列出来。
遇到需要使用操作符的题,可以联想一下进制原理来思考
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num1 int整型
* @param num2 int整型
* @return int整型
*/
int Add(int num1, int num2 ) {
int n = 0;
int m = 0;
n = (num1&num2)<<1;
m = (num1 ^num2);
while(n & m)
{
num1 = m;
num2 = n;
n = (num1&num2)<<1;
m = (num1 ^num2);
}
return n | m;
}
二:448. 找到所有数组中消失的数字 - 力扣(LeetCode)
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
// 将从0到i下标位置的值作为下标的的值置为负数
// 遍历将数组中的数字若果是正数则缺失的数字就是当前下标+1
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize) {
int* miss = (int*)malloc(sizeof(int)*(numsSize));
*returnSize = 0;
for(int i = 0; i < numsSize; i++)
{
if(nums[abs(nums[i])-1] > 0)
{
nums[abs(nums[i])-1] = -(nums[abs(nums[i])-1]);
}
}
for(int j = 0; j < numsSize; j++)
{
if(nums[j]>0)
{
miss[(*returnSize)++] = j+1;
}
}
return miss;
}
题解:
- 将原数组的的值的绝对值作为下标,将对应下标的值修改为负数。
- 遍历数组,如果对应下标的值大于0,则该位置就是缺失其中一个值,该缺失的值为i+1
注意:因为遍历数组是下标从0~n,但是nums数组从1~n,所以被修改位置的值要减1,也就是将对应下标的值作为下标的时候应该要减1。后面遍历数组的下标的时候,缺失数字的值就相应的+1.
另外一种做法是先排序再遍历,但是需要做特殊情况的处理,一些细节自己还不清楚,下次耍的时候自己在尝试一下能不能做出来。