算法题

作者: idri | 来源:发表于2017-08-21 17:57 被阅读0次

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(100w
100)。
方案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

相关文章

  • Android面经| 算法题解

    整理了校招面试算法题,部分《剑指offer》算法题,以及LeetCode算法题,本博文中算法题均使用Java实现校...

  • 面试题高频算法题整理

    以下算法题几乎都是简单题,都为面试算法题值得刷的题,需要理解并记住解题思路,而其中★标注的题,更是面试算法题中的高...

  • 回溯,贪心,动态规划

    1.回溯算法思想leetcode 112 号算法题:路径总和leetcode 113 号算法题:路径总和 IIle...

  • 算法题

    一、对一组数据进行降序或者升序排序(冒泡算法) intnums[10] = {4,5,1,10,7,1,8,3,6...

  • 算法题

    现在有一个字符串 string,它是一段英文,要求你统计这段英文里每个字母出现的次数。*例如输入 'Hello',...

  • 算法题

    名企笔试:网易2017春招笔试(工作安排)【http://mp.weixin.qq.com/s/y08d3WhZK...

  • 算法题

    写一个方法 获取一个字符串的长度? 写一个冒泡排序 数组去重 javascript实现格式化输出,比如输入9999...

  • 算法题

    1.求出1-100累加的和 2.求出1-100中奇数相加的和 3.求1000以内的斐波那契数 4.求1000以内的素数

  • 算法题

    1、求二进制数字中1的个数 自带库 (binary_num).count('1') 按位运算符有:左移运算符(<<...

  • 算法题

    1. 租金卡大放送 题目:“司庆大放送,一元即租房”,司庆当日,签约入住的客户,住满30天,返还(首月租金-1元)...

网友评论

      本文标题:算法题

      本文链接:https://www.haomeiwen.com/subject/qhacdxtx.html