面试练习题汇总
  • 说明
  • C/C++ 问答题汇总
  • 编程题汇总
    • 腾讯 2017 暑期实习生编程题
      • 构造回文
      • 算法基础-字符移位
      • 有趣的数字
    • 剑指 Offer 编程题练习
      • 二维数组中的查找
      • 从尾到头打印链表
      • 旋转数组的最小数字
      • 替换空格
      • 用两个栈实现队列
      • 重建二叉树
    • 网易 2017 校招笔试编程题
      • 二进制权重
      • 平方串
      • 数位和
  • 安全测试开发相关面试
    • 安全测试类面试参考
    • 业务安全类面试参考
    • 测试开发类面试参考
  • 深信服sangfor相关
    • 深信服acm相关
    • 测试类面试参考
    • 智安全杯
      • 智安全杯-2018比赛
      • 智安全杯-2019初赛
      • 智安全杯-2019复赛
  • 软件测试题汇总
  • 计算机知识题汇总
    • 前 75 题
    • 75 题以后
  • Python 语言特性
    • 1 Python的函数参数传递
    • 2 @staticmethod和@classmethod
    • 3 类变量和实例变量
    • 4 Python中单下划线和双下划线
    • 5 args and *kwargs
    • 6 面向切面编程AOP和装饰器
    • 7 单例模式
    • 8 Python 函数式编程
    • 9 Python 里的拷贝
  • stackoverflow-about-Python
    • Python中关键字yield有什么作用?
    • [Python中的元类(metaclass)是什么?](stackoverflow-about-Python/Python中的元类(metaclass)是什么.md)
    • Python中如何在一个函数中加入多个装饰器?
    • 如何判断一个文件是否存在?
    • 如何调用外部命令?
    • 枚举类型的使用?
    • 在Windows下安装pip?
    • 字典合并问题
    • 在Android上运行Python
    • 根据字典值进行排序
    • 在函数里使用全局变量
    • 变化的默认参数
    • 装饰器classmethod和staticmethod的区别
    • 检查列表为空的最好办法
    • 怎么用引用来改变一个变量
    • 检查文件夹是否存在的操作
    • name=main的作用
    • super与init方法
    • str与repr的区别
    • 循环中获取索引
    • 类里的静态变量
    • 怎么在终端里输出颜色?
    • 为什么用pip比用easy_install的好?
    • join的问题
    • 把列表分割成同样大小的块
    • 为什么代码在一个函数里运行的更快
    • 如何快速合并列表中的列表?
    • 如何知道一个对象有一个特定的属性?
    • 如何通过函数名的字符串来调用这个函数?
    • 单下划线和双下划线的含义?
  • Python 面试编程题
    • 1 台阶问题 斐波那契
    • 2 变态台阶问题
    • 3 矩形覆盖
    • 4 杨氏矩阵查找
    • 5 去除列表中的重复元素
    • 6 链表成对调换
    • 7 创建字典的方法
    • 8 合并两个有序列表
    • 9 二分查找
    • 10 快排
    • 11 找零问题
    • 12 二叉树相关
    • 13 单链表逆置
Powered by GitBook
On this page
  • 题目描述
  • 自己的解答
  • 正确但是超时的解答
  • 尝试优化的代码
  • 通过测试的代码,不知道效率如何

Was this helpful?

  1. 编程题汇总
  2. 网易 2017 校招笔试编程题

二进制权重

题目描述

一个数的二进制权重被定义为一个十进制数表示为二进制数中 '1' 的个数。例如:

1 的二进制权重就是 1

1717 表示为二进制数为 11010110101,所以二进制权重为 7

现在给出一个正整数 N,返回最小的一个大于 N 并且二进制权重跟 N 相同的数。

输入描述:

输入一个数 N(1 <= N <= 1,000,000,000)

输出描述:

输出一个数,即为最小的一个大于 N 并且二进制权重跟 N 相同的数

输入例子:

1717

输出例子:

1718

自己的解答

正确但是超时的解答

def get_weight(number):
    return bin(number).count("1")

n = int(sys.stdin.readline().strip())
weight_n = get_weight(n)
for i in range(n + 1, 1000000000):
    if get_weight(i) == weight_n:
        print(i)

尝试优化的代码

由于自己当时笔试的时候写出来的版本只能通过 50% 的例子,所以下面先写个测试代码,再来改进自己的优化算法:

# 测试代码
#!/bin/env python3
# -*- coding: utf-8 -*-
# version: Python3.X
"""
这里的版本是一个超时但是正确的版本, 用这个版本来进行测试
"""
import unittest
from binary_weight import solve

__author__ = '__L1n__w@tch'


class TestBinaryWeightSolve(unittest.TestCase):
    def test_solve(self):
        for i in range(1, 1000000000):
            test_answer = solve(i)
            right_answer = TestBinaryWeightSolve.__right_answer(i)
            log_message = "i = {}, right: {}, my_answer: {}".format(i, right_answer, test_answer)
            self.assertEqual(right_answer, test_answer, log_message)

    @staticmethod
    def __right_answer(n):
        weight_n = TestBinaryWeightSolve.__get_weight(n)
        for i in range(n + 1, 1000000000):
            if TestBinaryWeightSolve.__get_weight(i) == weight_n:
                return i
        raise RuntimeError("[*] 自己的算法有问题了")

    @staticmethod
    def __get_weight(number):
        return bin(number).count("1")


if __name__ == "__main__":
    pass

通过测试的代码,不知道效率如何

#!/bin/env python3
# -*- coding: utf-8 -*-
# version: Python3.X
"""
20160924 发现原来只是 index == len(reverse_temp) - 1: 那里写错了, 改过来之后能够通过测试了
20160924 这是之前只能通过 50% 例子的版本, 现在利用测试找出算法缺陷
"""

__author__ = '__L1n__w@tch'


def get_weight(number):
    return bin(number).count("1")


def get_start_number(number):
    temp = bin(number)[2:]
    reverse_temp = temp[::-1]
    flag = False
    for index in range(len(reverse_temp)):
        # 查找到 0
        if reverse_temp[index] == "0" and flag == False:
            continue
        # 找到所要找的数字了
        if reverse_temp[index] == "1":
            flag = True
        # 找到最后一个数字了
        if index == len(reverse_temp) - 1:
            result = "1" + "0" * (index + 1)
            return int(result, 2)
        if reverse_temp[index] == "0" and flag == True:
            result = "0" * index + "1" + reverse_temp[index + 1:]
            result = result[::-1]
            return int(result, 2)


def solve(number):
    start_number = get_start_number(number)
    weight_n = get_weight(number)
    for i in range(start_number, 1000000000):
        if get_weight(i) == weight_n:
            return i


if __name__ == "__main__":
    solve(1)
Previous网易 2017 校招笔试编程题Next平方串

Last updated 5 years ago

Was this helpful?