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> int('1111', 2)
15
> int('f', 16)
15
> int('17', 8)
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
7>def runoob(arg):    # 两个局部变量:arg、z
...     z = 1
...     print (locals())
... 
> runoob(4)
{'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  | \ (在行尾时) 续行符  | 
###