查看原文
其他

Python | Python面试基础+算法题精讲

上海小胖 Python专栏 2018-10-26


作者:yang_bingo

来源:https://blog.csdn.net/yang_bingo/article/details/80285205


第一题

def accum(s):
   # TOD
   pass

# accum("abcd") => "A-Bb-Ccc-Dddd"
# accum("cwAt") => "C-Ww-Aaa-Tttt"

这到题用到了字符串的字母大写、小写、字符串拼接、复制。用到的函数有 join 将列表中的内容按照指定字符连接成一个字符串,

  • upper() 所有字母变大写 和lower() 所有字母小写

  • 对于一个可迭代的(iterable)对象,enumerate将其组成一个索引序列,利用它可以同时获得索引和值

  • enumerate多用于在for循环中得到计数


具体代码:

def asuum(s):
   return '-'.join(y.upper() + y.lower()* x for x,y in enumerate(s))
a = asuum('abcd')
print(a)

第二题

def duplicate_count():
   # TODO
   pass

# 实现将一串字符串返回该字符串有重复的的字母个数包括大小
# test.assert_equals(duplicate_count("abcde"), 0)
# test.assert_equals(duplicate_count("abcdea"), 1)
# test.assert_equals(duplicate_count("indivisibility"), 1)

这里用到了将所有字母都转成小写还有集合,和列表

具体代码:

def duplicate_count(text):  
   text = text.lower()
   # 用以去重,和原文本进行对比
   texts = set(text)  
   lists = []  
   for i in texts:  
       numbers = text.count(i)  
       if numbers != 1:  
           lists.append(numbers)  
   return len(lists)

第三题

def descending_order(num):
   # TODO
   pass

# descending_order(21445) => 54421
# descending_order(145263) => 654321
# descending_order(1254859723) => 9875543221

具体代码:

def descending_Order(num):
   return int("".join(sorted(str(num), reverse=True)))


第四题

def error_printer(s):
   # TODO
   pass

# s="aaabbbbhaijjjm", error_printer(s) => "0/14"
# s="aaaxbbbbyyhwawiwjjjwwm", error_printer(s) => "8/22"
# 计算字符串有多少个在'abcdefghijkmlm'里

具体代码:

from re import sub  
def printer_error(s):  
   return "{}/{}".format(len(sub("[a-m]",'',s)),len(s))

我们讲一下sub 的用法

re.sub共有五个参数。

re.sub(pattern, repl, string, count=0, flags=0)

其中三个必选参数:pattern, repl, string

两个可选参数:count, flags

第一个参数:pattern

pattern,表示正则中的模式字符串,这个没太多要解释的。

第二个参数:repl

repl,就是replacement,被替换,的字符串的意思。

repl可以是字符串,也可以是函数。

repl是字符串

如果repl是字符串的话,其中的任何反斜杠转义字符,都会被处理的。

\n:会被处理为对应的换行符; 
\r:会被处理为回车符; 
其他不能识别的转移字符,则只是被识别为普通的字符: 
比如\j,会被处理为j这个字母本身; 
反斜杠加g以及中括号内一个名字,即:\g,对应着命名捕获

第三个参数:string

string,即表示要被处理,要被替换的那个string字符串。


第五题

def expanded_form(num):
   # TODO
   pass

# expanded_form(12) => '10 + 2'
# expanded_form(42) => '40 + 2'
# expanded_form(70304) => '70000 + 300 + 4'

具体代码:

def expanded_form(num):  
   nums = str(num)  
   x = []  
   # 这里也可以用enumerate来做
   for i in range(0, len(nums)):  
       if int(nums[i]) != 0:  
           s = str(int(nums[i]) * (10 ** (len(nums) - i - 1)))  
           x.append(s)  
   return ' + '.join(x)

第六题

def order_weight(s):
   # TODO
   pass

# 计算每一个数字的累加和
# order_weight("2000 10003 1234000 44444444 9999 11 11 22 123") => "11 11 2000 10003 22 123 1234000 44444444 9999")
# 2000就是2, 10003就是4, 也就是这串数字的累加和

具体代码:

def order_weight(s):  
   return ' '.join(sorted(sorted(s.split(' ')),key = lambda x:sum(int(c) for c in x)))

首先把这个数进行切割,然后用lambda算出这个数的累加和,在根据累加和进行排序。


第七题

def valid_parentheses(s):
  # TODO
  pass

# "()" => True
# ")(()))" => False
# "(" => False
# "(())((()())())" => True
# 判断是否是有效空号对

具体代码:

def valid_parentheses(string):  
   cnt = 0  
   for i in string:  
       if i == "(":
           cnt+=1  
       if i == ")":
           cnt-=1  
       if cnt < 0:
           return False  
   return True if cnt == 0 else False

这道题目题解很多,这是最简单的了,大家可以自行实现一个栈,当然也可以去我的github的exercise/python_data_structure/base_data_structure/stack.py下载,这道题目其实是一个标准的检验栈实现。

检测到一个左括号就压栈,检测到一个右括号就出栈,最后检查栈,若还有元素则False,没有则True。


所有代码都已上传:https://github.com/MiracleYoung/exercises/

也欢迎来我的博客下方留言互动: https://miracleyoung.github.io/



小胖开设了「Python专栏」星球,里面会有「Python原创」、「大航海计划」、「问题解答」、「面试刷题」、「大厂内推」、「技术分享」等。

目前正在做的是一个「大航海计划」:由船长发起,分为多个阶段,或招募或淘汰若干名船员,每周都会在星球做一次项目汇报。启动资金由船员众筹10元,与我无关。目标是让球友能够在星球里找到志同道合的小伙伴一起驶向新世界。

加入星球,每天0.18元,在这个星球能够得到的,不只是关于Python,圈子、人脉、资源,学习氛围,眼界都是比技术更值得去借鉴的东西。

也欢迎球友提问,每天我都会回答大家的问题,方向不限。


推荐阅读:

Python | Jupyter导出PDF,自定义脚本告别G安装包

Shell | 大厂开发都在使用的Shell技巧

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存