C语言/数据结构位运算题解:异或XOR找出学习计划中的“独特学习时间“——只出现一次的数字

问题描述

小明和小红是两位热爱学习的同学,他们决定利用暑假时间学习新技能。他们列出了 n 个技能,每个技能有一个学习时间(单位:小时)。有趣的是,除了一个技能外,所有技能的学习时间都恰好出现了两次,这意味着有两个技能需要相同的时间完成。只有一个技能的学习时间是独一无二的。

现在,他们需要找出那个独特学习时间的技能,以便合理规划学习计划。请你设计一个算法,帮助他们在 O(n) 时间内找到这个独特学习时间的技能,同时尽量减少额外空间的使用。

要求:

  1. 设计一个算法,使其时间复杂度为 O(n),其中 n 是技能的数量。
  2. 尽量减少额外空间的使用,以体现你的算法优化能力。

测试样例

样例1:

输入:times = [5, 10, 5, 10, 15, 20, 20] 输出:15 解释:学习时间 15 小时的技能是唯一没有配对的。

样例2:

输入:times = [0, 2, 0, 2, 1] 输出:1 解释:学习时间 1 小时的技能只出现一次,是独特的。

样例3:

输入:times = [3, 8, 3, 8, 12] 输出:12 解释:12 是技能列表中唯一一个不重复的学习时间。

约束条件

  • 1 ≤ times.length ≤ 1001
  • 0 ≤ timesi ≤ 1000
  • 技能数量为奇数
  • 除了一个技能的学习时间只出现一次外,其余每个学习时间都恰好出现两次

程序代码

#include <stdio.h>

int findUniqueTime(int* times, int timesSize) {

int result = 0;

for (int i = 0; i < timesSize; i++) {

result ^= timesi;

}

return result;

}

int main() {

int times1\[\] = {5, 10, 5, 10, 15, 20, 20};

int times2\[\] = {0, 2, 0, 2, 1};

int times3\[\] = {3, 8, 3, 8, 12};

printf("%d\n", findUniqueTime(times1, 7)); // 15

printf("%d\n", findUniqueTime(times2, 5)); // 1

printf("%d\n", findUniqueTime(times3, 5)); // 12

return 0;

}

cpp 复制代码
#include <stdio.h>

int findUniqueTime(int* times, int timesSize) {
    int result = 0;
    for (int i = 0; i < timesSize; i++) {
        result ^= times[i];
    }
    return result;
}

int main() {
    int times1[] = {5, 10, 5, 10, 15, 20, 20};
    int times2[] = {0, 2, 0, 2, 1};
    int times3[] = {3, 8, 3, 8, 12};
    
    printf("%d\n", findUniqueTime(times1, 7));  // 15
    printf("%d\n", findUniqueTime(times2, 5));  // 1
    printf("%d\n", findUniqueTime(times3, 5));  // 12
    
    return 0;
}

运行结果

相关推荐
wuminyu1 小时前
C++协程实现接收端的零拷贝Buffer管理原理剖析
java·linux·c语言·jvm·c++
小蒋学算法2 小时前
算法-交替删除操作后最后剩下的整数-跟着灵茶山艾府学算法
数据结构·算法
思麟呀4 小时前
位运算:从一个整数到一个集合
c语言·数据结构·c++·算法
All for pursuit.5 小时前
【分治-3】347.前K个高频元素
数据结构·c++·算法·leetcode
SuperByteMaster5 小时前
低功耗GPIO引脚配置
c语言
phltxy6 小时前
C 语言自定义类型:结构体、位段、枚举与联合体
c语言·开发语言
All for pursuit.7 小时前
【二分查找-2】34.在排序数组中查找元素的第一个和最后一个位置
数据结构·c++·算法·leetcode
大侠归来7 小时前
C语言与C++在基础语法上的区别
java·c语言·c++
bro_Java6667 小时前
链表进阶2:双向链表的构建
java·数据结构·链表