推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
kayseen
V2EX  ›  Python

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

  •  
  •   kayseen · May 9, 2019 · 6992 views
    This topic created in 2743 days ago, the information mentioned may be changed or developed.
    面试的时候遇到的,搞不懂,题目如下:

    一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字,使用 python 实现
    47 replies  •  2019-05-11 00:27:21 +08:00
    wolegequ
    wolegequ
    May 9, 2019 via Android❤️2
    1
    跟 py 无关,位运算
    meik2333
    meik2333
    May 9, 2019 via Android
    2
    lv2016
    lv2016
    May 9, 2019
    3
    建立一个列表,从第一个数开始搜索,如果在列表里则删除,不在则加入,最后剩的数就是只出现一次的
    lv2016
    lv2016
    May 9, 2019
    4
    @lv2016 发现自己菜的真实。。。
    megachweng
    megachweng
    May 9, 2019 via iPhone
    5
    counter?
    icreeper
    icreeper
    May 9, 2019 via iPhone
    6
    数组里所有数取异或,这题在 leetcode 有
    megachweng
    megachweng
    May 9, 2019
    7
    ```
    from collections import Counter

    l = [1, 1, 2, 3, 4, 5, 5, 4]
    c = Counter(l)
    print(c.most_common()[-1][0])

    >>> 3
    ```
    xabc
    xabc
    May 9, 2019
    8
    数据放入集合,完成 😄

    集合元素具有唯一性
    mashpolo
    mashpolo
    May 9, 2019 via iPhone
    9
    二进制的异或最快
    justfortest
    justfortest
    May 10, 2019
    10
    遍历异或运算就行
    CEBBCAT
    CEBBCAT
    May 10, 2019 via Android
    11
    不仅菜,还不会搜索…… 上升空间有限啊,加油吧
    azh7138m
    azh7138m
    May 10, 2019 via Android❤️2
    12
    这不是菜,是蔡
    inhzus
    inhzus
    May 10, 2019 via Android❤️1
    13
    reduce(lambda x, y: x ^ y, array)
    dangyuluo
    dangyuluo
    May 10, 2019
    14
    pythonic 的办法是用 set 和 diff
    huntzhan
    huntzhan
    May 10, 2019❤️2
    15
    蔡得口交
    Nimrod
    Nimrod
    May 10, 2019 via Android
    16
    这种题就是你做一次以后都会做了
    20015jjw
    20015jjw
    May 10, 2019 via Android
    17
    xor
    luozic
    luozic
    May 10, 2019 via iPhone
    19
    python 可以用异或或者位运算,空间复杂度是 O(1 ),不过时间复杂度 O(n)。
    jmc891205
    jmc891205
    May 10, 2019
    20
    改下题目:
    一组数据中只有一个数字出现了一次。其他所有数字都是出现了多次的。 请找出这个数字。

    还有什么讨巧的方法吗?
    aluckyfish
    aluckyfish
    May 10, 2019
    21
    XOR
    Leigg
    Leigg
    May 10, 2019 via iPhone
    22
    @jmc891205 这个用什么讨巧方式,底层都得遍历吧
    reduce/filter/itertools
    luozic
    luozic
    May 10, 2019 via iPhone
    23
    搞个树去处理,这种不就是压缩的算法?
    luozic
    luozic
    May 10, 2019 via iPhone
    24
    @jmc891205 搞个树去处理,这种不就是压缩的算法核心?
    ebingtel
    ebingtel
    May 10, 2019
    25
    @luozic 空间效率 比不过 map 吧?
    wlkq
    wlkq
    May 10, 2019
    26
    使用 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
    anyuhanfei
    May 10, 2019
    27
    @jmc891205 用桶排序的一部分方法应该就可以吧,统计出每个元素出现的个数,数量为 1 的就是答案
    bxb100
    bxb100
    May 10, 2019 via Android
    28
    ^ over
    lshu
    lshu
    May 10, 2019
    29
    按照我理解的题意
    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
    bengxy
    May 10, 2019❤️1
    30
    为啥大家对新人程序员这么不友好,不都是这么过来的吗?
    只有有几个提出实质解法的,其他都在喷,感情你生下来就会异或运算?
    inhzus
    inhzus
    May 10, 2019 via Android
    31
    @bengxy 因为按照楼主的题意直接谷歌都可以搜到上百个答案了 https://i.loli.net/2019/05/10/5cd4d7a7ee817.png

    当然在楼上我并没有喷
    marsgt
    marsgt
    May 10, 2019
    32
    贴个 leetcode 中文的链接吧:
    https://leetcode-cn.com/problems/single-number/
    dovme
    dovme
    May 10, 2019
    33
    交换律:a ^ b ^ c <=> a ^ c ^ b

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

    相同的数异或为 0:n ^ n => 0
    southsala
    southsala
    May 10, 2019
    34
    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
    Vegetable
    May 10, 2019
    35
    leetcode 里这题目好像还是不是 easy 呢.其实就是位运算.
    dovme
    dovme
    May 10, 2019
    36
    @southsala #34
    public static int getResult(int[] nums){

    for (int i = 1;i < nums.length ; i++){
    nums[0] ^= nums[i];
    }
    return result;
    }
    dovme
    dovme
    May 10, 2019
    37
    @dovme #36
    public static int getResult(int[] nums){

    for (int i = 1;i < nums.length ; i++){
    nums[0] ^= nums[i];
    }
    return nums[0];
    }
    Achilless
    Achilless
    May 10, 2019
    38
    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
    zzzmj
    May 10, 2019
    39
    ....... 我感觉就算不知道 异或,纯数学应该也可以想到吧 sum(set(list)) * 2 - sum(list)
    chefdd
    chefdd
    May 10, 2019
    40
    异或
    zdnyp
    zdnyp
    May 10, 2019
    41
    >>> l = [1,2,3,4,1,2,3]
    >>> for i in l:
    ... if l.count(i) == 1:
    ... print(i)
    ...
    4
    >>>
    list 没有 count 方法吗?
    exonuclease
    exonuclease
    May 10, 2019 via iPhone
    42
    异或一遍
    balaWgc
    balaWgc
    May 10, 2019
    43
    leetcode 上有,之前做过,异或遍历可得
    lyc1116
    lyc1116
    May 10, 2019
    44
    在数组有序的前提下,复杂度能够优化到 O(logn), 思路是二分查找
    c4f36e5766583218
    c4f36e5766583218
    May 10, 2019
    45
    这个三角函数我不会!
    brainfxxk
    brainfxxk
    May 10, 2019
    46
    我觉得这种题真的很无聊...
    harpy
    harpy
    May 11, 2019
    47
    楼主既然想要做软件开发,还是要继续努力啊,不用位运算,这样的题目也不应该被难住。。可以想象面试官当时的表情。。。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1899 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 84ms · UTC 15:37 · PVG 23:37 · LAX 07:37 · JFK 10:37
    ♥ Do have faith in what you're doing.