6. Z 字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
具体题目链接
Python(参考leetcode答案)
class Solution:
def convert(self, s: str, numRows: int) -> str:
length,cur_Row,state=len(s),0,False
if numRows==1:return s
minrows=min(numRows,length)
t=['']*minrows
for i in range(length):
if cur_Row==0 or cur_Row==minrows-1:
state=not state
t[cur_Row]+=s[i]
cur_Row=cur_Row+1 if state else cur_Row-1
return ''.join(t)
思路:
1 .普通情况:通过创建一个min(numRows,length)个字符串列表t,用来记录最终每一行的结果,通过下标cur_Row来回移动进行记录。
2 .当numRows为1时,则直接返回列表。
3.在循环过程中如果下标cur_Row等于0或等于minrows-1时进行反转状态,true为向下,false为向上。
GO(参考leetcode答案)
func convert(s string, numRows int) string {
length,cur_row,state:=len(s),0,false
if numRows==1{
return s
}
minrows:=min(numRows,length)
t:=make([]string,minrows)
for i:=0;i<length;i++{
if cur_row==0 || cur_row==minrows-1{
state=!state
}
t[cur_row]+=string(s[i])
if state{
cur_row+=1
}else{
cur_row-=1
}
}
return strings.Join(t,"")
}
func min(x,y int) int{
if x>y{
return y
}
return x
}
思路:参考python思路。
7. 整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1]
,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
具体题目链接
Python(参考leetcode答案)
class Solution:
def reverse(self, x: int) -> int:
INT_MIN_10,INT_MAX_10,rev= -2**31//10+1, (2**31 - 1)//10,0
while x != 0:
if rev < INT_MIN_10 or rev > INT_MAX_10:
return 0
digit = x % 10
if x < 0 and digit > 0:
digit -= 10
x = (x - digit) // 10
rev = rev * 10 + digit
return rev
思路:1.很容易知道32位最小整数和最大整数分别为-2,147,483,648和2,147,483,647。另外python对负数进行求余数时,商会比其他程序小1,余数digit 返回为正数。因此INT_MIN_10求商后+1。为了使余数digit 变成小于0则进行-10,使其变成正常形式。
2.分析:因为正常情况下的数翻转可能会大于int32类型的范围,例如2,147,483,647翻转便造成溢出,为了解决此问题,我们要在最后一位之前与214,748,364进行判断,如果大于214,748,364则无疑会溢出,如果小于214,748,364则必定不会溢出,如果等于214,748,364,我们就要分析最后一位是否大于7,不大于则无问题,大于则溢出。负数也是类似分析。
看似分析完成,但未能很分析完毕,如果等于214,748,364,又因为是int32,则证明输入的值首位必定为1或2,则必然小于7。
因此最后结果只有两种:大于214,748,364溢出,小于等于214,748,364有效。
具体分析可见官方证明。
GO(参考leetcode答案)
func reverse(x int) int {
INT_MIN_10,INT_MAX_10,rev,digit:= math.MinInt32/10, math.MaxInt32/10,0,0
for x!=0{
if rev < INT_MIN_10 || rev > INT_MAX_10{
return 0
}
digit=x%10
x/=10
rev=rev*10+digit
}
return rev
}
思路:如python分析相同,但无需python进行负数的商和余数处理。