1、求二进制数字中1的个数
自带库 (binary_num).count('1')
def num_of_one(num):
'''
bin():convert the num to binary string
'''
if num >= 0:
nbin = bin(num)
return nbin.count('1')
else:
num = abs(num)
nbin = bin(num-1)
return 32 - nbin.count('1')
按位运算符有:左移运算符(<<),右移运算符(>>),按位与(&),按位或(|),按位翻转(~),
异或运算(^)
。这些运算符中只有按位翻转运算符是单目运算符,其他的都是双目运算符。
3<<2 解法:11向左移动两位变为1100,即12
~3 :3的二进制是11, -(11+1)=-100B=-4D. (注:B和D分别表示二进制和十进制).解法: - (-10+1) =1
链接:https://www.nowcoder.com/questionTerminal/8ee967e43c2c4ec193b040ea7fbb10b8来源:牛客网**绝对最佳答案及分析:**
public class Solution {
public int NumberOf1(int n) {
int count = 0;
while(n!= 0){
count++;
n = n & (n - 1);
}
return count;
}
}
**答案正确:恭喜!您提交的程序通过了所有的测试用例**
**分析一下代码:** **这段小小的代码,很是巧妙。**
**如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。**
**举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。**
2、不通过第三变量进行两个变量互换
a = 3 #11
b = 8 #1000
a = a^b # a = 1011 b = 11
b = b^a # a = 1011 b = 1000
a = a^b # a = 11
3、一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。
http://dataunion.org/21517.html
方案1:这题是考虑时间效率。用trie树统计每个词出现的次数,时间复杂度是 O(nle)(le表示单词的平准长度)。然后是找出出现最频繁的前10个词,可以用堆来实现,前面的题中已经讲到了,时间复杂度是 O(nlg10)。所以总的时间复杂度,是O(nle)与O(nlg10)中较大的哪一个。
附、100w个数中找出最大的100个数。
方案1:在前面的题中,我们已经提到了,用一个含100个元素的最小堆完成。复杂度为O(100wlg100)。
方案2:采用快速排序的思想,每次分割之后只考虑比轴大的一部分,知道比轴大的一部分在比100多的时候,采用传统排序算法排序,取前100个。复杂度为O(100w100)。
方案3:采用局部淘汰法。选取前100个元素,并排序,记为序列L。然后一次扫描 剩余的元素x,与排好序的100个元素中最小的元素比,如果比这个最小的要大,那么把这个最小的元素删除,并把x利用插入排序的思想,插入到序列L中。依 次循环,知道扫描了所有的元素。复杂度为O(100w*100)。
4、3次称出12球中重量不同的一个球的解答
解法第一次必须分为三组。
A = 8, B =4
第一次称量:A组二分称量
情况1:若相等则在B中,从B中拿出3个,再从A中拿出3个称量,若相当,则球为剩的一个。
若不等,则知道该球是重还是轻,假设为重。从3个球中取两个球,称量。若相等则球为剩余那个,若不等,则重的即是所求球。
情况2:若第一次不等,记录两侧轻重,
设为C组D组,C重D轻
称量C1,C2,C3,D1===C4,正常3个球
若左重右轻,球在C1C2C3中
若右重左轻,球为C4
第三次称量同情况1