58同城, 2017春招后端编程题

1.字符串转数字

太简单了. 略.

2.考察异或

这里写图片描述

2.1 第一问

数组中有若干个整数, 只有一个出现了一次, 其他数字都出现了两次, 找出这个数字.

相同的数字, 异或结果是 0; 0 异或一个数字, 结果就是该数字.
根据这个特性, 数组内的元素迭代异或就是结果.

2.2 第二问

数组中有若干个整数, 只有两个出现了一次, 其他数字都出现了两次, 找出这两个数字.

  • step1
    还是逐个异或, 记不相同的数字为a与b, 那么结果result=a ^b.
  • step2
    将result不断右移, 找到第一个为1的位的位置, 记为pos. 这就说明a与b在这一位上值不一样.
  • step3
    把pos 位为1的筛选出来, 他们之间相互异或, 就得到了a.
  • step4
    往原数组里添进去a, 问题转化成了第一问, 就找到了b.

2.3 代码

#python
def findAppearsOnce(arr):
    result=0;
    for num in arr:
        result=result^num;
    return result;


def findAppearsTwice(arr):
    """ step1 """ 
    result=0;
    for num in arr:
        result=result^num;
    """ step2 """
    pos=0;tmp=result;
    while(True):
        if(tmp & 1 !=0):
            break;
        pos+=1;
        tmp=tmp>>1;
    """step 3"""
    tmp=0
    for num in arr:
        if((num>>pos) & 1 != 0):
            tmp=tmp^num;
    result1=tmp;
    """step 4"""
    arr.append(result1)
    result2=findAppearsOnce(arr)
    return result1,result2;

arr=[1,2,3,4,5,5,4,3,2,1,66]
arr2=[1,2,3,4,5,5,4,3,2,1,66,67]

print findAppearsOnce(arr)
print findAppearsTwice(arr2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值