牛客网学习笔记(HJ15求存储时1的个数、HJ21简单密码)

71 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目来自牛客网的华为机试题库,本题目为简单题

HJ15 求int型正整数在内存中存储时1的个数

描述
输入一个 int 型的正整数,计算出该 int 型数据在内存中存储时 1 的个数。

数据范围:保证在 32 位整型数字范围内
输入描述:
输入一个整数(int类型)
输出描述:
这个数转换成2进制后,输出1的个数

示例1
输入:5
输出:2

n = int(input())
re = 0
while n > 0:
    if n % 2 == 1:
        re += 1
        n -= 1
    n = n // 2
print(re)

解析

用数学的思路有余数就是有1

HJ21 简单密码

描述
现在有一种密码变换算法。九键手机键盘上的数字与字母的对应: 1--1, abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8 wxyz--9, 0--0,把密码中出现的小写字母都变成九键键盘对应的数字,如:a 变成 2,x 变成 9.而密码中出现的大写字母则变成小写之后往后移一位,如:X ,先变成小写,再往后移一位,变成了 y ,例外:Z 往后移是 a 。 数字和其它的符号都不做变换。

输入描述:
输入一组密码,长度不超过100个字符。
输出描述:
输出密码变换后的字符串

示例1
输入:YUANzhi1987
输出:zvbo9441987

我写的

s = input()
for i in s:
    if i.isupper() and i != 'Z':
        print(chr(ord(i.lower())+1),end='')
    elif i.isupper() and i == 'Z':
        print('a',end='')
    elif i.islower():
        if i in 'abc':
            print(2,end='')
        elif i in 'def':
            print(3,end='')
        elif i in 'ghi':
            print(4,end='')
        elif i in 'jkl':
            print(5,end='')
        elif i in 'mno':
            print(6,end='')
        elif i in 'pqrs':
            print(7,end='')
        elif i in 'tuv':
            print(8,end='')
        else:
            print(9,end='')
    else:
        print(i,end='')

有经验的写的

s = input()
re = []
dic = ['2','2','2','3','3','3','4','4','4','5','5','5','6','6','6','7','7','7','7','8','8','8','9','9','9','9']
for i in range(len(s)):
    if s[i] >='A' and s[i] < 'Z':
        re.append(chr(ord(s[i].lower())+1))
    elif s[i] == 'Z':
        re.append('a')
    elif s[i] >= 'a' and s[i] <= 'z':
        re.append(dic[ord(s[i])-ord('a')])
    else:
        re.append(s[i])
print(''.join(re))

解析

有时候字典真的很好使啊