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

1.字符串转数字

太简单了. 略.

2.考察异或

58同城, 2017春招后端编程题_第1张图片

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)

你可能感兴趣的:(准备工作-笔面试)