【剑指卷王】找单身狗

简介: 题目:找单身狗(简单)

题目:找单身狗(简单)



给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。


不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。


说明:


为什么返回数值是整数,但输出的答案是数组呢?


请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。


你可以想象内部操作如下:


// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}


思路要点:

操作符^:两个相同的数异或为0;0异或任何数为任何数


参考代码:


int missingNumber(int* nums, int numsSize){
    //记录异或的结果
    int x=0;
    int i;
    for(i=0;i<=numsSize;i++)
    {
        //先异或一遍完整的数据
         x^=i;
        if(i<numsSize)
        //异或数组中的数
            x^=nums[i];
    }
    //得到的结果为缺失的数
    return x;
}


执行结果:4cb1ccf30472448a87805cd72d329096.png


题目:找单身狗(复杂)


一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。


示例:


e5a0761fa758498ab776846f6ecb58a3.png


  • 思考要点:

将两个单身狗分开来异或,单独得到两个单身狗


  • 参考代码:
1.int* singleNumbers(int* nums, int numsSize, int* returnSize){
    //动态开辟数组
    int* arr=(int*)malloc(2*sizeof(int));
    //记录异或结果
    int eor=0;
    //得到的结果为两个单身狗异或的结果
    for(int i=0;i<numsSize;i++)
    {
        eor^=nums[i];
    }
    //两个单身狗必定有个二进制位置数据不一,以此作为分治的判断依据
    //找到异或结果最右边位1的位置
    int right=eor&(~eor+1);
    //创建两个数依据
    int one=0;int two=0;
    for(int i=0;i<numsSize;i++)
    {
        //&right结果不为0则在最右边为1的位置上为该数据也为1
         if(right&nums[i])
         {
             //得到的结果为那只单身狗
             one^=nums[i];
         }
         //为0则在最右边为1的位置上为该数据为0
         else
         {
              two^=nums[i];
   }
    }
    arr[0]=one;
    arr[1]=two;
    *returnSize=2;
    return arr;
}


执行结果:


2fdb6f369ecf485da498f6662617c138.png





相关文章
AcWing 4261. 孤独的照片(每日一题)
AcWing 4261. 孤独的照片(每日一题)
每日一练Day04:寻找单身狗
每日一练Day04:寻找单身狗
【LeetCode每日一题】找(一只或者多只)单身狗
【LeetCode每日一题】找(一只或者多只)单身狗
119 1
【LeetCode每日一题】找(一只或者多只)单身狗
【C刷题笔记】找单身狗问题
【C刷题笔记】找单身狗问题
|
算法 C语言 C++
LeetCode 每日一题2347. 最好的扑克手牌
给你一个整数数组 ranks 和一个字符数组 suit 。你有 5 张扑克牌,第 i 张牌大小
101 0
【AcWing每日一题】4261. 孤独的照片
【AcWing每日一题】4261. 孤独的照片
84 0
|
算法 测试技术
蓝桥杯2022年第十三届决赛真题-卡牌——二分法
蓝桥杯2022年第十三届决赛真题-卡牌——二分法
149 0
|
测试技术
第十届蓝桥杯题解 ---渣渣分析
第十届蓝桥杯题解 ---渣渣分析
|
存储 人工智能 BI
AcWing - 寒假每日一题2023(DAY 11——DAY 15)
AcWing - 寒假每日一题2023(DAY 11——DAY 15)
LeetCode每日一题——799. 香槟塔
我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个,依次类推到第 100 层,每个玻璃杯 (250ml) 将盛有香槟。
144 0
LeetCode每日一题——799. 香槟塔