Day_07

一:不用加减乘除做加法_牛客题霸_牛客网 (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;
}

题解:

  1. 将原数组的的值的绝对值作为下标,将对应下标的值修改为负数。
  2. 遍历数组,如果对应下标的值大于0,则该位置就是缺失其中一个值,该缺失的值为i+1

注意:因为遍历数组是下标从0~n,但是nums数组从1~n,所以被修改位置的值要减1,也就是将对应下标的值作为下标的时候应该要减1。后面遍历数组的下标的时候,缺失数字的值就相应的+1.

另外一种做法是先排序再遍历,但是需要做特殊情况的处理,一些细节自己还不清楚,下次耍的时候自己在尝试一下能不能做出来。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值