首页 软件代码

LeetCode-题库-刷题(6-7)


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进行负数的商和余数处理。





文章评论

目录