Re: [问题] 两个阵列元素找出不同

楼主: Killercat (杀人猫™)   2015-03-05 13:18:20
※ 引述《jehovah (Lucius)》之铭言:
: 朋友面试遇到的问题~
: C里面两个阵列a b,元素都一样,只是b比a多了一个元素
: 如何不用比较子> < ==等等 找出不同的元素
: 想了一阵子没有头绪~可以指点一些方向吗^^
这题其实很简单,不过如果标准答案supposed是这个的话
我会觉得这家公司块陶啊....
假设这两个阵列的element都是c(c可以是int char...etc)
首先我们先用bitwise查出他们是在第几个bit不同
a ^ b, 然后找出第一个1就是第几个bit不同
000000000000000000000000111111111111111111111111.....
假设sizeof(c)是1(也就是8bit) 也就是a b前三个(0 1 2)都相同
b[3]就一定是多出来的那个,ok 所以要怎么找出来呢,很简单
我们把a[3]全部填1 a b就会等长了,最后我们把a b做and bitwise
假设出来是d, 那d[3]就是多出来的那个数字
这不叫做技术 这叫做脑筋急转弯.....
楼主: Killercat (杀人猫™)   2015-03-05 13:19:00
另外这算法其实是有一个疏漏的,看有没有人能看出来 XD
作者: Frozenmouse (*冰之鼠*)   2015-03-05 13:38:00
没看错的话 a, b 要先排序过才行吧XD
作者: bibo9901 (function(){})()   2015-03-05 13:49:00
这不是标准答案...标准答案是 fold( xor, a + b )
楼主: Killercat (杀人猫™)   2015-03-05 13:50:00
诶 所以a b排序都不同喔...那真的要sort一下了 XDfold...我还真的没看过,长见识了,感谢 :D
作者: azureblaze (AzureBlaze)   2015-03-05 13:59:00
不需要sort 时间O(n) 空间O(1)可解
楼主: Killercat (杀人猫™)   2015-03-05 14:00:00
而且sort应该算是一定得用comparator了吧...所以应该不能sort, 恩这更脑筋急转弯了囧
作者: Ebergies (火神)   2015-03-05 14:01:00
fold( xor, a + b ) 这个可以详细说明一下吗~?
作者: bibo9901 (function(){})()   2015-03-05 14:04:00
那是 functional 的表达方法, 总之就是用 xor 把 a, b所有元素串起来就是答案了
作者: Ebergies (火神)   2015-03-05 14:05:00
喔那我了解了, 的确是这样
作者: Frozenmouse (*冰之鼠*)   2015-03-05 14:06:00
长知识了…XD
楼主: Killercat (杀人猫™)   2015-03-05 14:06:00
这做法真的颇优秀 :D 跟x^=y^=x^=y有拼但是....仍然是脑筋急转弯 orz 除非以前有看过
作者: azureblaze (AzureBlaze)   2015-03-05 14:32:00
进阶题: N个阵列 一样有一个比其他的多了一个元素给了基本题的解法后进阶题就不能算脑筋急转弯了
作者: Frozenmouse (*冰之鼠*)   2015-03-05 15:02:00
N是偶数的话很明显,奇数还在想 orz
作者: bibo9901 (function(){})()   2015-03-05 19:49:00
挑最长的一个XDD?
作者: ckc1ark (伪物)   2015-03-05 21:48:00
用n进位表示 在各位数rotate不进位
作者: Frozenmouse (*冰之鼠*)   2015-03-06 01:04:00
目前想的方法都避不开if…XD

Links booklink

Contact Us: admin [ a t ] ucptt.com