1、第4章-18 猴子选大王
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
我的代码:
他人的代码:
反思:
这又是一道想了很久的题目,但是看到别人的代码的那一刻,我当场就是虎躯一震,这不是和我的思路差不多吗??!为了避免这种惨案再次发生,我对这两个代码进行了比较,以下是总结出来的主要问题:
思路上:首先,由于我一直没有一个很清晰的解题思路,所以想到什么方法就直接实践,一是没有做好记录,导致最后出来的包含了所有方法的一小部分,也就是由于代码没有进行及时的修改,现有的解题代码是在原来的解题代码上进行的,修改不彻底,无辜耗费大量时间和精力。其次,我没有很好地将每一个步骤想清楚如何用计算机语言表示出来,这也导致了上一个问题的出现
修改方法一:可以选择开多个窗口,在另一个窗口写下新的方法,再进行比对和修改,写出新的代码
好处:直观
坏处:要写好多次代码
**修改方法二:**在纸上写方法,然后自己脑子里面debug,直到找到最好的解决方法
好处:比起上一个方法,准确率更高
坏处:耗费时间长,脑子里面debug有可能算错,纸上写又很耗时间
目前打算两种都试试,看看哪个更适合,或者有新的
2、第4章-19 矩阵运算
给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。
我的代码:
# -*- coding: utf-8 -*-
import numpy as np
# 初始化
n = int(input())
t = n
total = 0
diagonal = 0
last_column = 0
last_row = 0
storage = []
# 生成矩阵
for _ in range(n):
temporary = list(map(int, input().split()))
storage.extend(temporary)
matrix = np.array(storage).reshape((n, n))
# 计算出副对角线,最后一列和最后一行的所有元素之和还有所有元素之和,把他们相减
for i in range(n):
diagonal += matrix[t-1][i]
t -= 1
for j in range(n):
for m in range(n):
total += matrix[j][m]
last_row += matrix[n - 1][j]
last_column += matrix[j][n-1]
print(total-last_row-last_column-diagonal+matrix[n-1][0]+matrix[0][n-1]+matrix[n-1][n-1]
)
他人的代码:
n=int(input())
a=[]
sum=0
for i in range(n):
s=input()
a.append([int(n) for n in s.split()])
for j in range(n):
for k in range(n):
if j!=n-1 and k!=n-1 and j+k!=n-1:
sum+=a[j][k]
print(sum)
反思:
①在他人的代码里面使用的变量sum在我这里写成了total,其实我一开始也是想用sum的,然而直接给我报错"shadows built in name"??!stack overflow里面的解释好像是说(英文水平有限,理解错了请谅解)这是某种bug?Warning里面说这是种W292 error,应该又是违反了PEP8协议了,由于犯错次数太多,我把我的错误整理在下面,以后忘记了再回来看看,不用再到处找:
PEP 8: E231 missing whitespace after ‘,’
这个意思是逗号后面要有一个空格
PEP 8: W292 no newline at end of file
这里是要求你在末尾新起一行
PEP 8: E262 inline comment should start with ‘# ’
行内注释应该以’#'加空格开始
②好家伙原来还可以这样使用append把输入的不确定个数的元素插入到列表里面:
s=input()
a.append([int(n) for n in s.split()])
我也试过如果直接使用a.append(map(int,input().split())的话,得到的是一个“[map in XXX000…]