这道 Python 题目有大神会做吗?

2019-05-09 23:09:22 +08:00
 kayseen
面试的时候遇到的,搞不懂,题目如下:

一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字,使用 python 实现
5125 次点击
所在节点    Python
47 条回复
robot9
2019-05-10 08:17:45 +08:00
XOR
Leigg
2019-05-10 08:45:33 +08:00
@jmc891205 这个用什么讨巧方式,底层都得遍历吧
reduce/filter/itertools
luozic
2019-05-10 08:47:19 +08:00
搞个树去处理,这种不就是压缩的算法?
luozic
2019-05-10 08:47:48 +08:00
@jmc891205 搞个树去处理,这种不就是压缩的算法核心?
ebingtel
2019-05-10 09:04:51 +08:00
@luozic 空间效率 比不过 map 吧?
wlkq
2019-05-10 09:09:29 +08:00
使用 php 的函数实现了一下。python 也有对应的函数吧

$a = [1,2,3,4,5,6,7,8,9,10,1,2,3,4,6,7,8,9,10];
$a_r = array_reverse($a,true);
$a_f = array_flip($a);
$a_r_f = array_flip($a_r);

$result = [];
foreach ($a_f as $k => $v){

if($v != $a_r_f[$k]) continue;

$result[] = $k;
}

// 输出 $result : [5]
anyuhanfei
2019-05-10 09:11:20 +08:00
@jmc891205 用桶排序的一部分方法应该就可以吧,统计出每个元素出现的个数,数量为 1 的就是答案
bxb100
2019-05-10 09:32:21 +08:00
^ over
lshu
2019-05-10 09:33:21 +08:00
按照我理解的题意
x1+x2+...+xn+x(n+1) = s1
根据题意 我们令 前 n 个为成对的

2(x1+x2+...+x(n/2)) + x(n+1) = s1
同除 2 得到公式 1
x1+x2+...+x(n/2) + x(n+1)/2 = s1/2

然后去重求和得到公式 2
x1+x2+...+x(n/2) + x(n+1) = s2

两式相减
结果 = 2*s2 - s1
程序如下
l = [1, 1, 2, 2, 7, 4, 5, 5, 4]
print(2 * sum(set(l)) - sum(l)) == 7
bengxy
2019-05-10 09:42:48 +08:00
为啥大家对新人程序员这么不友好,不都是这么过来的吗?
只有有几个提出实质解法的,其他都在喷,感情你生下来就会异或运算?
inhzus
2019-05-10 09:47:43 +08:00
@bengxy 因为按照楼主的题意直接谷歌都可以搜到上百个答案了 https://i.loli.net/2019/05/10/5cd4d7a7ee817.png

当然在楼上我并没有喷
marsgt
2019-05-10 10:08:19 +08:00
贴个 leetcode 中文的链接吧:
https://leetcode-cn.com/problems/single-number/
dovme
2019-05-10 10:16:43 +08:00
交换律:a ^ b ^ c <=> a ^ c ^ b

任何数于 0 异或为任何数 0 ^ n => n

相同的数异或为 0:n ^ n => 0
southsala
2019-05-10 10:23:05 +08:00
Java 实现就这个样子吧,遍历一遍异或运算。
异或刚好满足这个题目需求,这个题目考点应该就是异或运算。
两个相同的数比如 88 88,二进制是 1011000 1011000,异或位运算(相同为 0)结果 0000000,也就是 0。

public static int getResult(int[] nums){
int result = 0;
for (int i = 0;i < nums.length ; i++){
result = result ^ nums[i];
}
return result;
}
Vegetable
2019-05-10 10:25:55 +08:00
leetcode 里这题目好像还是不是 easy 呢.其实就是位运算.
dovme
2019-05-10 10:33:38 +08:00
@southsala #34
public static int getResult(int[] nums){

for (int i = 1;i < nums.length ; i++){
nums[0] ^= nums[i];
}
return result;
}
dovme
2019-05-10 10:36:26 +08:00
@dovme #36
public static int getResult(int[] nums){

for (int i = 1;i < nums.length ; i++){
nums[0] ^= nums[i];
}
return nums[0];
}
Achilless
2019-05-10 10:38:29 +08:00
s = [1, 1, 2, 2, 3, 4, 4]
for i in s:
s.remove(i)
if i in s:
continue
else:
print(i)
break
zzzmj
2019-05-10 11:50:48 +08:00
....... 我感觉就算不知道 异或,纯数学应该也可以想到吧 sum(set(list)) * 2 - sum(list)
chefdd
2019-05-10 15:48:12 +08:00
异或

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/562683

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX