2018/11/26 20:38
开始刷华为机试题目,共108道,加油鸭~
记录一下自己的找工作心路历程,希望明年可以拿offer拿到手软~~
华为机试在线测试
字符串最后一个单词的长度
1 | 题目描述 |
python代码:
1 | str = input().strip().split() |
计算字符个数
1 | 题目描述 |
python代码:
1 | a=input().lower() |
lower()
lower() 方法转换字符串中所有大写字符为小写。
增加本题的鲁棒性。
count()
count() 方法用于统计字符串里某个字符出现的次数。可选参数为在字符串搜索的开始与结束位置。
str.count(sub, start= 0,end=len(string))
明明的随机数
1 | 题目描述 |
代码:1
2
3
4
5
6
7
8
9
10while True:
try:
a=int(input())
res=set()
for i in range(a):
res.add(int(input()))
for i in sorted(res):
print(i)
except:
break
分析:之前自己编的时候总是有问题,需要注意:题目中说测试用例不止一组,所以要加while True:只有有数据来就运行它,还要加 try-except,避免出现问题,成为死循环(在机试环境下试了,不加这两个,就不能通过),所以要注意!!!!
sort和sorted的区别
sort是应用在list上的方法,sorted可以对所有可迭代的对象进行排序操作。
list的sort方法返回的是对已经存在的列表进行操作,而内建函数sorted方法返回的是一个新的list,而不是在原来的基础上进行的操作。
例如:1
2
3
4
5
6
7
8
9
10
11
12
13
14>>> a=[1,2,5,3,9,4,6,8,7,0,12]
>>> a.sort()
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12]
>>> a=[1,2,5,3,9,4,6,8,7,0,12]
>>> sorted(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12]
>>> a
[1, 2, 5, 3, 9, 4, 6, 8, 7, 0, 12]
区别:
对于一个无序的列表a,调用a.sort(),对a进行排序后返回a,sort()函数修改待排序的列表内容。
而对于同样一个无序的列表a,调用sorted(a),对a进行排序后返回一个新的列表,而对a不产生影响。
字符串分隔
1 | 题目描述 |
自己写的没通过的代码:
1 | s = str(input()) |
网上的正确代码:
1 | def pirnt8(line): |
分析:自己的思路和答案是一样的,而且都用到了关键的一步,就是右侧补零,line+"0"*(8-len(line))
,自己的问题出在,题目没审清楚,说的是输入两次,所以我的框架就是错的,而且哪怕是输入一次也是错的,因为字符串的长度有可能是大于16的。
zfill函数
在网上找末尾补零的时候,找到了这个函数,可以自动给字符串前面补零(zfill=zero fill的缩写)。
1 | n = "123" |
raw_input()和input()区别
raw_input()只有python2.7版本可以用的,python3里面已经把raw_input()给去掉了,在 Python 3 内,将 raw_input() 重命名为 input();
字符的时候可以用raw_input(),当然不怕麻烦也可以用input()手动加’’
int类型的时候最好用input().
python装饰器
今天我看廖雪峰官方网站的时候,看到过这个,当时感觉没看懂,刚在洒哥哥博客看到,就搬运一下,好像和这道题没关系~~
装饰器本质上是一个Python函数,可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象,需求的场景:插入日志、性能测试、事务处理、缓存、权限校验。
例子:
比如写了很多个简单的函数,你想知道在运行的时候哪些函数在执行,只是想要很简单的在执行完毕之前给它打印一句“start”,应该是这样:
1 | def func_name(arg): |
这样做是没有错,但是有想过没,难道想给每一个函数后面都加上那么一句吗?等运行完再一个个的删掉print不觉得麻烦吗?一个不麻烦,十个,一百个呢。
装饰器可以这么来:1
2
3
4
5
6
7
8
9
10
11
12
13
14def log(func):
def wrapper(*arg,**kw):
print 'Start %s' % func
return func(*arg,**kw)
return wrapper
def func_a(arg):
pass
def fun_b(arg):
pass
def fun_c(arg):
pass
其中,log函数就是装饰器,把装饰器写好后给需要装饰的函数前面加上@log就可以,装饰器节省了代码量,并且在函数不需要装饰的时候直接把@log去掉就可以,只需要用编辑器全局查找然后删除即可。
进制转换
1 | 题目描述 |
1 | while True: |
注意:题中说多组输入,要用try不然不能通过.
python间的进制转换
任意进制->十进制int()
可以将二进制,八进制,十六进制转换成十进制整型:1
2
3
4
5
6'1111', 2) > int(
15
'f', 16) > int(
15
'17', 8) > int(
15
整型–>字符;chr()
1 | chr(90) |
字符–>整型:ord()
1 | ord('Z') |
十进制–>十六进制:hex()
1 | hex(255) |
十进制–>二进制:bin()
1 | bin(255) |
质数因子
1 | 题目描述 |
1 | a,res=int(input()),[] |
注意:输入的是整数,必须int(input())
python算数运算符
+加
-减
*乘
/除
%取模 - 求余
**幂,返回a的b次幂
//取整除 - 返回商的整数部分(向下取整)
1 | >>> 9//2 |
取近似值
1 | 题目描述 |
1 | a=float(input()) |
合并表记录
1 | 题目描述 |
1 | while True: |
注意:.split()默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等,此处如果写成.split(‘ ‘)就会不不通过,原因应该是输入的类型可能两个数字之间隔得是空字符,都有可能。
使用collections.defaultdict类(了解内容)
defaultdict是Python内建dict类的一个子类,第一个参数为default_factory属性提供初始值,默认为None。它覆盖一个方法并添加一个可写实例变量。它的其他功能与dict相同,但会为一个不存在的键提供默认值,从而避免KeyError异常。之前例子的实现如下:
1 | >>> from collections import defaultdict |
提取不重复的整数
1 | 题目描述 |
1 | result="" |
注意:input()[::-1]是把输入取反
sort和sorted
对于一个无序的列表a,调用a.sort(),对a进行排序后返回a,sort()函数修改待排序的列表内容。
而对于同样一个无序的列表a,调用sorted(a),对a进行排序后返回一个新的列表,而对a不产生影响。
字符个数统计
1 | 题目描述 |
1 | print (len(set([i for i in input() if ord(i) in range(128)]))) |
注意:不同字符!!!
这里面用到了列表生成器!!
数字颠倒
1 | 题目描述 |
1 | print(input()[::-1]) |
步长为-1,表示为可迭代对象进行反转!!
字符串反转
1 | 题目描述 |
1 | print(input()[::-1]) |
句子逆序
1 | 题目描述 |
1 | print(' '.join(input().split()[::-1])) |
分析:由split把句子拆分为几个字符串,然后又由[::-1]进行逆序,最后通过join在每个单词之间加空格。
str >>>list
.split()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16str1 = "12345"
list1 = list(str1)
print list1
str2 = "123 sjhid dhi"
list2 = str2.split() #or list2 = str2.split(" ")
print list2
str3 = "www.google.com"
list3 = str3.split(".")
print list3
输出为:
[python] view plain copy
['1', '2', '3', '4', '5']
['123', 'sjhid', 'dhi']
['www', 'google', 'com']
list >>>str
‘’.join()1
2
3
4
5
6
7
8
9
10
11str4 = "".join(list3)
print str4
str5 = ".".join(list3)
print str5
str6 = " ".join(list3)
print str6
输出为:
[python] view plain copy
wwwgooglecom
www.google.com
www google com
字串的连接最长路径查找
1 | 题目描述 |
1 | a=int(input()) |
求int型正整数在内存中存储时1的个数
1 | 题目描述 |
1 | print(str(bin(int(input()))).count("1")) |
count()方法
count() 方法用于统计字符串里某个字符出现的次数。
1 | str.count(sub, start= 0,end=len(string)) |
- sub – 搜索的子字符串
- start – 字符串开始搜索的位置。默认为第一个字符,第一个字符索引值为0。
- end – 字符串中结束搜索的位置。字符中第一个字符的索引为 0。默认为字符串的最后一个位置。
Python 质数判断
一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除(2, 3, 5, 7等),换句话说就是该数除了1和它本身以外不再有其他的因数。
1 | # Python 程序用于检测用户输入的数字是否为质数 |
背包问题
最经典的背包问题可以描述为:
有n个物品,每个物品的重量为w[i],每个物品的价值为v[i]。现在有一个背包,它所能容纳的重量为W,问:当你面对这么多有价值的物品时,你的背包所能带走的最大价值是多少?
思路:每个物品无非是装入背包或者不装入背包,那么就一个一个物品陆续放入背包中。
我们用c[i][w]表示处理到第i 个物品时背包容量为w下所能装下的最大价值。关键的状态转移方程如下:
购物单 (有点小问题!!)
1 | 题目描述 |
1 | n,m = map(int,input().split()) |
注意:
① 对于prices = [0]*m
,提前定好prices这个list的大小,后面就可以直接赋值,如果不这样写,写成’prices=[]’也可以,不过后面就得用append();
② ‘result = [[0](n+1) for i in range(m+1)]’,相当于生成m+1个[0](n+1)这样的零列表,也就是生成[m+1,n+1]这样的零矩阵,result表示的是最后要输出的值(物品的价格与重要度的乘积);其中,result[1][10]开始取值的;
③ i和j分别表示商品和价格的遍历,这两个for循环位置可以换;它们两个只要固定一个,判断另一个就好,比如:固定i,表示固定了这一件商品,先判断主件还是附件,在判断能不能买得起,买得
起的情况下,买和不买哪一个的result大,这样的流程依次遍历;
④ 如果是附件,他的处理方式是:必须要买主件才能买附件,所以,如果买,则要减去主件和附件的prices,并加上主件和附件的result值;
⑤应该注意的一点是:此时的i和j表示的就是当前的商品和价格,但是prices、depend、degree这三个数组是从0开始的,所以标号为i-1;
⑥如果为附件时,prices[i-1]
表示的是当前附件的价格,prices[depend[i-1]-1]
表示的是附件对应主件的价格,depend[i-1]
表示当前附件所对应的主件的编号,因为prices从0开始,因此要减一。
坐标移动
1 | 题目描述 |
代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45def check(string):
if string == '':
return False
t = list(string)
start = t.pop(0)
if start in ['A', 'W', 'D', 'S'] and ''.join(t).isdigit():
return True
return False
def doA(a, init=[0, 0]):
init[0] -= a
def doD(d, init=[0, 0]):
init[0] += d
def doW(w, init=[0, 0]):
init[1] += w
def doS(s, init=[0, 0]):
init[1] -= s
while True:
try:
init = [0, 0]
res = list()
strings = input().strip(';').split(';')
for i in strings:
if check(i):
res.append(i)
for i in res:
i = list(i)
x = i.pop(0)
i = int(''.join(i))
if x == 'A':
doA(i, init)
elif x == 'D':
doD(i, init)
elif x == 'W':
doW(i, init)
elif x == 'S':
doS(i, init)
print('{0},{1}'.format(init[0], init[1]))
except:
break
注意:pop(0)方法后,列表中的元素就不包含这一项了,相当于被弹出了;
init[0]表示横坐标, init[1]表示纵坐标;
list pop()方法
pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
语法:list.pop([index=-1])
参数:
obj – 可选参数,要移除列表元素的索引值,不能超过列表总长度,默认为 index=-1,删除最后一个列表值。
代码中用的是i=i.pop(0),表示返回第一个元素,例如:i=[‘A’,’1’,’0’],返回的是A;
isalnum()方法
Python isalnum() 方法检测字符串是否由字母和数字组成.
语法:str.isalnum()
返回值:
如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False.
isdigit()方法
Python isdigit() 方法检测字符串是否只由数字组成。
语法:str.isdigit()
返回值:如果字符串只包含数字则返回 True 否则返回 False。
strip()方法
例如:s为字符串,rm为要删除的字符序列
s.strip(rm) 删除s字符串中开头、结尾处,位于 rm删除序列的字符
s.lstrip(rm) 删除s字符串中开头处,位于 rm删除序列的字符
s.rstrip(rm) 删除s字符串中结尾处,位于 rm删除序列的字符
注意:
- 当rm为空时,默认删除空白符(包括’\n’, ‘\r’, ‘\t’, ‘ ‘)
- 这里的rm删除序列是只要边(开头或结尾)上的字符在删除序列内,就删除掉。
- 只有在两边才能删除!!!!
list
注意:split()方法是对字符串进行分割,返回的是一个list,而且默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
format ()格式化函数
基本语法是通过 {} 和 : 来代替以前的 % 。
format 函数可以接受不限个参数,位置可以不按顺序。
1 | "{} {}".format("hello", "world") # 不设置指定位置,按默认顺序 > |
数字格式化方法
详细介绍
识别有效的IP地址和掩码并进行分类统计
1 | 题目描述 |
该程序通过率60%:将( # IP合法的前提下计数)这一块内容中的条件判断写全就100%通过了(还是没想通,先这样记住吧);
分析:是因为当a=127时,不应该等于B类,如果不写全,会判错;
if…elif的判断是从上到下的,满足一个条件后,就不会再判断其他的条件了。
1 | A, B, C, D, E, F, G = 0, 0, 0, 0, 0, 0, 0 |
locals() 函数
locals() 函数会以字典类型返回当前位置的全部局部变量。
对于函数, 方法, lambda 函式, 类, 以及实现了 call 方法的类实例, 它都返回 True。
语法 : locals()
返回值 : 返回字典类型的局部变量。
实例:1
2
3
4
5
6
7def runoob(arg): # 两个局部变量:arg、z >
... z = 1
... print (locals())
...
4) > runoob(
{'z': 1, 'arg': 4} # 返回一个名字/值对的字典
>
.format(**locals())
利用 locals() 函数结合 string 对象的format方法可以用于高效创建格式化字符串,例如:1
2
3
4
5
6
7
8
9def fun(a, b):
x = 20
y = 30
sum = x + y
prod = x * y
formatStr = '{x} + {y} = {sum}; {x} * {y} = {prod}.'
print(formatStr.format(**locals()))
# print: '20 + 30 = 50; 20 * 30 = 600.'
**locals() 将根据 formatStr 中位于括号内的变量名实现映射解包操作。
bin()函数
bin() 返回一个整数 int 或者长整数 long int 的二进制表示。
注意:返回的是一个字符串;
例如:1
2
3
4>>>bin(10)
'0b1010'
>>> bin(20)
'0b10100'
简单错误记录
1 | 题目描述 |
1 | res = dict() |
注意:要加try…except,否则会不通过。
注意:其中的res=dict(),定义了一个空的字典(用来存储key-value),目的是用来计算这种错误出现的次数的。
python转义字符
1 | \ (在行尾时) 续行符 |
###