千家信息网

有关Python问题的详细解说

发表于:2024-10-22 作者:千家信息网编辑
千家信息网最后更新 2024年10月22日,这篇文章主要讲解了"有关Python问题的详细解说",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"有关Python问题的详细解说"吧!问题1:谁先赢?微
千家信息网最后更新 2024年10月22日有关Python问题的详细解说

这篇文章主要讲解了"有关Python问题的详细解说",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"有关Python问题的详细解说"吧!

问题1:谁先赢?微软

艾米和布拉德轮流滚动一个漂亮的六边形模具。谁先掷出" 6"赢得比赛。艾米首先滚动。艾米获胜的机率是多少?

(1) 思路

这是一个核心的模拟问题,没有比模拟大量过程并检查Amy获胜的可能性更好的方法了。

艾米滚第一。如果结果为6,则游戏结束,艾米获胜。否则,布拉德(Brad)翻牌,如果是6,则赢得比赛。如果不是,则转回艾米(Amy)。重复该过程,直到有人以6结束游戏。

在这里,关键是要了解逻辑流程:谁赢了,在什么情况下赢了。如果艾米得到6分,布拉德必须投掷吗?没有。

(2) 解题

import numpy as np  def who_won(die, size):          A_count = 0 # initialize A_count          B_count = 0 # initialize B_count          for i in range(size): # create an iteration                   A_6 = np.random.choice(die)  # roll the fair dice and choose a random value from 0 to 6                  if A_6 == 6:       # if A rolls a 6, then A_count adds 1.                           A_count+=1     # a side-note for Python beginners: the full expression is "A_countA_count = A_count+1."                  else:              # if the above if condition does not fullfill                          B_6 = np.random.choice(die)  # then, it's B's turn to roll the dice, which is a random choice from 0 to 6.                          if B_6 == 6:   # if B rolls a B, B_count adds 1.                                  B_count+=1                      return A_count/(A_count+B_count)   # return the total number of cases that A won divided by the combined number of A and B wonaka. the result is the probability that Amy wins.

检查第11行:A_6是Amy的数据分布,如果她的数据为6,则计数为+1。否则,布拉德可以掷骰子。

在最后(第25行),最终结果应该是Amy获胜的次数除以Amy和Brad获胜的总数。一个常见的错误是将A_count除以仿真总数。这是不正确的,因为当Amy和Brad都未能掷出6时,会有迭代。

让我们测试一下上述算法。

np.random.seed(123)  die = [1,2,3,4,5,6]  size = 10000  who_won(die,size) view raw

0.531271015467384

事实证明,艾米(Amy)在布拉德(Brad)之前就开始滚动赢得这场比赛。艾米(Amy)在10,000次模拟中获胜的概率为53%。

> Photo by john vicente on Unsplash

问题2:每个主要公司的最大数量为69

-给定一个仅由数字6和9组成的正整数num。-返回最多可更改一个数字可得到的最大数字(6变为9,而9变为6)。https://leetcode.com/problems/maximum-69-number/

(1) 思路

给定一个正整数,只有一种方法可以增大值,即将" 6"变成" 9",而不是相反。另外,我们必须更改最左边的6;否则,它不是最大数量。例如,我们必须将" 6996"更改为" 9996",而不是" 6999"。

我想出了这个问题的几种变体:您可以更改一次,也可以全部更改为6。

(2) 解决方法1:替换一次

# replace once def max_69_once(num):     return int(str(num).replace('6','9',1))  # test case num = 966666669 max_69_once(num)

996666669

在第3行中,我们将整数转换为字符串,然后将第一个" 6"替换为" 9";使用int()将其返回为整数。

(3) 解决方案2:全部替换

def max_69_all(num):     k = len(str(num))     return int(str(num).replace('6','9',k))  # test case num = 966666669 max_69_all(num)

999999999

对于第二种情况,我们不必指定k,因为replace()方法默认会更改所有合适的值。我出于教学目的指定了k值。这个问题的另一个变体是替换前两个或三个" 6"以使数字最大。

> Photo by Alessandro Capuzzi on Unsplash

问题3:有效的完美正方形。Facebook

-给定正整数num,编写一个函数,如果num是一个完美的平方则返回True;否则返回False。-后续操作:请勿使用任何内置库函数(例如sqrt)。

https://leetcode.com/problems/valid-perfect-square/

(1) 思路

这非常简单:检查正整数是否具有理想的平方根,如果有正整数,则返回True,这可以分两步完成。

  • 找到平方根。

  • 检查它是否是完美的平方根。

棘手的部分是我们必须使用内置库(例如,数学,Numpy)来计算平方根,这在LeetCode上是一个简单的问题。如果我们不能使用这些库,那么它将成为更具挑战性和反复性的问题,这是LeetCode的一个中等水平的问题。

(2) 解决方案1:内置库

import math   def valid_perfect_square(num):     return int(math.sqrt(num))**2==num  # the int() method only returns the integer part and leaves out the decimal part.                                         # For perfect squares, there should be no decimal part. The equation should thus hold.  # test case  valid_perfect_square(16)

该算法轻松通过了测试案例。应当指出,我们需要使用int()方法仅获取平方根的整数部分,而忽略任何小数部分。对于完美的正方形,它不会有任何差异,因此等式成立。对于非完美的平方,方程将不成立并返回False。

(特别感谢韩琦发现错误!)

解决方案2:没有内置库和二进制搜索

# 1 find the squre root of num # 2 check if it is a perfect square number  # solution: no built-in library & binary search def valid_perfect_square(num):     if num < 2:          return True     left, right = 2, num//2       # create two pointers: left and right      while left<=right:            # while loop to constantly update left and right          x = left + (right-left)//2# take a wild guess and treat x as the starting point         xx_squared = x*x           # calculate the squared value of x         if x_squared == num:      # use the following 'if-else' statement to constantly update x_squared.             return True           # if there are the same, return True         if x_squared 

如果不允许使用任何库,则采用二进制搜索。LeetCode包含一个详细的解释(在此处),我也对此主题发表了另一篇文章(在这里)。简而言之,我们创建左右两个指针,并将这两个数字的平均值与原始数字进行比较:如果小于该数字,则增加该值;如果更大,我们减少它;或者,如果它们匹配,则返回True。

这些条件将在while循环中自动检查。

#问题4:阶乘尾随零。彭博社

给定整数n,返回n中的尾随零!

后续行动:您能否编写一种适用于对数时间复杂度的解决方案?

https://leetcode.com/problems/factorial-trailing-zeroes/

(1) 思路

这个问题有两个步骤:

  • 计算n阶乘n!

  • 计算尾随零的数量

对于第一步,我们使用while循环迭代遍历n个阶乘并停止循环直到1。对于第二步,事情变得有些棘手。

该问题要求尾随零而不是总数零。这是个很大的差异。8!是40,320,它有2个零,但只有1个尾随零。我们在计算时必须格外小心。我提出了两种解决方案。

(2) 解决方案1:向后读取字符串

# 1 calculate n! # 2 calculate the number of trailing zeros  def factorial_zeros(n):     product = n     while n > 1 :         # iteratively calculate the product         product *= (n-1)         n-=1              count = 0           for i in str(product)[::-1]:  # calculate the number of trailing zeros         if i == '0':             count+=1         else:             break     return count  factorial_zeros(20)

计算产品的第一部分是不言而喻的。对于第二部分,我们使用str()方法将乘积转换为字符串,然后向后读取:如果数字为0,则将count加1;否则为0。否则,我们将打破循环。

break命令在这里至关重要。如前所述,上述函数无需中断命令即可计算零的总数。

(3) 解决方案2:while循环

def factorial_zeros(n):     product = n     while n > 1 :          # step 1: iteratively calculate the product          product *= (n-1)         n-=1     count = 0           while product == 0:   # step 2: calculate the number of trailing zeros         productproduct = product/10         count+=1              return count

第一部分与解决方案1相同,唯一的区别是我们使用while循环来计算尾随数字:对于乘积除以10的乘积,最后一位必须为0。因此,我们使用while循环不断更新while循环,直到条件不成立为止。

顺便说一句,解决方案2是我最喜欢的计算零的方法。

> Photo by Jamie Fenn on Unsplash

问题5:完美数字,亚马逊

  • 理想数字是一个正整数,它等于其正因数之和,但不包括数字本身。

  • 整数x的除数是可以将x均匀除的整数。

  • 给定整数n,如果n是完美数则返回true,否则返回false。

  • https://leetcode.com/problems/perfect-number/

(1) 思路

这个问题可以分为三个步骤:

  • 找出正因数

  • 计算总和

  • 决定:完美与否

第2步和第3步是不言而喻的,最多不超过一层。但是,棘手的部分是找到正除数。为此,我们可以采用野蛮力方法,并在从1到整数的整个序列中进行迭代。

理论上,它应该适用于一个小整数,但是如果我们运行大数,它将超过时间限制。时间效率不高。

(2) 解决方案1:暴力

#1. find the positive divisors #2. calculate the sum  #3. perfect or not   def perfect_number(num):     divisors = []     for i in range(1,num):         if num%i==0:             divisors.append(i)     if sum(divisors)==num:         return True     else:         return False          # test case 1 perfect_number(2)

此方法不适用于较大的值。您的面试官可能会要求更有效的解决方案。

(3) 解决方案2:sqrt(n)

# solution 2: sqrt(n)  def perfect_number(num):          if num<=1:         return False          divisors = set([1])          for i in range(2,int(num**0.5)+1):   # from 2 to num**0.5         if num%i==0:             divisors.add(i)             divisors.add(num//i)      return sum(divisors)==num

要找到其除数,我们不必检查最大为整数的值。例如,要找到100的除数,我们不必检查从1到100的数字。相反,我们只需要检查直到100的平方根即10,并且所有其他可用值都已经为包括在内。

这是一种最佳算法,可为我们节省大量时间。

总结

  • 在进行了数十次"实践"编码之后,最大的收获就是理解问题并将问题分为多个可操作的组件。

  • 在这些可行的部分中,总会有一个步骤使求职者绊倒。诸如"不能使用内置函数/库"之类的限制。

  • 关键是逐步编写自定义函数,并尝试避免在练习例程中尽可能多地使用内置函数。

感谢各位的阅读,以上就是"有关Python问题的详细解说"的内容了,经过本文的学习后,相信大家对有关Python问题的详细解说这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

问题 整数 数字 方案 解决方案 艾米 方法 循环 检查 最大 函数 平方根 思路 这是 部分 布拉德 布拉 有关 两个 总数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全金句 网络技术方面的权威 数据库索引的单词 广播站中网络技术部是干嘛的 360网络安全中心无法开启 金博宝芝林广州医药软件开发 前瞻网数据库是安全网站吗 数据库技术 认证 电脑软件开发有什么要求 幻塔选哪个服务器人多 无限流量gia服务器 保护网络安全的部门 松江区网络软件开发收费套餐 上海移动软件开发服务费 免费数据库文献 华为服务器和笔记本电脑能否直连 网络安全隔空对话 数据库参照查询中的模糊查询 如何查询发票数据库 聊城计算机软件开发哪家靠谱 数据库上执行闪回事务的先决条件 数据网络技术有限公司 找不到服务器应用程序源文件图表 河南办公系统软件开发服务费 浪潮的服务器在哪 网络安全发展走向趋势 陆河java软件开发在线咨询 网络管理转服务器管理 数据库附加后修改默认值 查询postpresql数据库
0