理想的人物不仅要在物质需要的满足上,还要在精神旨趣的满足上得到表现。 —— 黑格尔
目录
题目:
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
示例 1:
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
示例 2:
输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]

做题链接:剑指 Offer 56 - I. 数组中数字出现的次数
假如数组中的数字是:1,2,10,4,1,4,3,3。我们将这些数字进行排序,排序之后为1,1,2,3,3,4,4,10。我们的目标就是找出没有重复出现的两个数字,也就是2和10。
我们使用一个指针指向排序好数组的最后一个位置。
1.然后看这个位置的数字和前一个位置的数字相不相等。如果相等,也就是没有找到我们的目标数字,然后指针向前移动两个位置,继续找,以此类推。
2.如果最后一个位置和前一个位置不相等,那么此时的最后一个位置也就是我们找到的第一个目标数字。然后指针向前移动一位,继续找前面的数字。
那么上述的话是什么意思呢?我们使用画图来理解。

理解上述的话之后,我们直接上手写代码:
#include<stdlib.h>
int cmp_int(void* p1, void* p2)
{
return *(int*)p1 - *(int*)p2;
}
int main()
{
int arr[10] = { 0 };
int n = 0;
scanf("%d", &n);
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
qsort(arr, n, sizeof(int), cmp_int);//这里使用快排的进行排序
int right = n - 1;
int j = 0;
int k = 0;
while (right > 0)
{
if (arr[right] != arr[right - 1])
{//这里不相等,则找到了,直接打印出来
printf("%d ", arr[right]);
if (right == 1)
{
printf("%d", arr[0]);
}
right -= 1;//所以right-1,指向下一个位置
}
else
{
right -= 2;//否则right-2,指向下两个位置
}
}
return 0;
}
if (right == 1)
{
printf("%d", arr[0]);
}
这个代码如何理解呢?我们举个例子来讲解一下。
如果我们排序好的数组是 1 ,2,5,5,7,7,9,9。那么我们要找的数字就是1和2, 此时right指向的就是2,然后2和前面的1比较,显然2和1不相等,那么2就是我们要找到的数字。
然后right向前移动一位,指向1,然后1再和前面的数字进行比较,但是1前面没数字了,那么退出循环。但是1没有打印出来呀,所以我们单独打印第一个数字。这就是这个代码的意思。

异或的计算法则是:二进制相同为0,不同为1。
有一个找单身狗的题:数组中其他数字均出现两次,有一个数字出现了一次,我们的目标就是找这个出现一次的数字,我们就可以使用异或全部的数字,得到的答案就是我们要找的数字,因为相同的数字异或为0,0和目标数字异或得到目标数字。
做题方法:这题我们一样可以使用异或整个数组来实现。相同的数字异或为0,最后的异或结果就是两个目标数字异或的结果。假如数组为1,2,10,4,1,4,3,3。

废话不多说,直接上代码:
int* singleNumbers(int* nums, int numsSize, int* returnSize) {
int* ans = (int*)calloc(2, sizeof(int));//calloc开辟的空间会自动赋值为0
int temp = 0;
int i = 0;
for (i = 0; i < numsSize; i++)
{
temp ^= nums[i];//temp就是两个目标数字异或的结果
}
int pos = 0;//记录位置
for (i = 0; i < 32; i++)
{
if (((temp >> i) & 1) == 1)//找二进制第一个1的位置
{
pos = i;
break;
}
}
//分组异或
for (i = 0; i < numsSize; i++)
{
if (((nums[i] >> pos) & 1) == 1)
{
ans[0] ^= nums[i];
}
else
ans[1] ^= nums[i];
}
*returnSize = 2;
return ans;
}
希望能对你有所帮助,感谢你的支持。
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>
我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']
查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用