리트코드 문제 6,7
6. Zigzag Conversion
The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this:
P A H N
A P L S I I G
Y I R
And then read line by line: “PAHNAPLSIIGYIR” Write the code that will take a string and make this conversion given a number of rows:
입력: s = “PAYPALISHIRING”, numRows = 3
출력: “PAHNAPLSIIGYIR”
내 풀이
class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows == 1:
return s
zigzag = [[] for _ in range(numRows)]
i, j, k = 0, 0, 0
while j < len(s):
if i!= 0 and i % numRows == 0:
zigzag = zigzag[::-1]
i += 1
k += 1
continue
zigzag[i%numRows].append(s[j])
i += 1
j += 1
if k % 2 == 1:
zigzag = zigzag[::-1]
ans = ''
for l in zigzag:
ans += ''.join(l)
return ans
- zigzag 리스트에 numRows만큼 빈 리스트를 생성한다.
- zigzag의 리스트에 s의 문자를 하나씩 추가한다.
- i % numRow == 0 일때 마다 zigzag 요소를 반대로 뒤집는다.
- k는 최종적으로 답을 리턴을 할때 zigzag가 처음상태와는 반대로 뒤집혀져 있는지 나타내는 값이다. 만약 홀수이면 처음상태와는 반대로 뒤집혀져 있다는 의미이므로 다시 반대로 집는다.
결과
Runtime: 104 ms, faster than 45.37% of Python3 online submissions for Zigzag Conversion. Memory Usage: 14 MB, less than 51.46% of Python3 online submissions for Zigzag Conversion.
풀이 1
class Solution(object):
def convert(self, s, numRows):
if numRows == 1 or numRows >= len(s):
return s
L = [''] * numRows
index, step = 0, 1
for x in s:
L[index] += x
if index == 0:
step = 1
elif index == numRows -1:
step = -1
index += step
return ''.join(L)
- idx가 0에 한번 도달하면 numRows-1 에 도달할때까지 1만큼 커진다.
- idx가 numRows-1에 한번 도달하면 0에 도달할때까지 1만큼 작아진다.
- 매우 간단한 풀이방법으로 runtime과 memory 모두 내풀이 방법보다 현저히 낮게 나온다.
7. Reverse Integer
Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-231, 231 - 1], then return 0.
입력: x = 123
출력: 321
내 풀이
class Solution:
def reverse(self, x: int) -> int:
x = str(x)
if x[0] == '-':
x = '-' + x[:0:-1]
else:
x = x[::-1]
x = int(x)
if x<(-2)**31 or x>(2**31)-1:
return 0
else:
return x
- 문자열 슬라이싱을 x[ac] 라고 할때 a부터 b까지 c단계만큼 밟는다
결과
Runtime: 50 ms, faster than 56.09% of Python3 online submissions for Reverse Integer. Memory Usage: 13.9 MB, less than 63.35% of Python3 online submissions for Reverse Integer.
풀이 1
class Solution:
def reverse(self, x):
sign = [1,-1][x < 0]
rst = sign * int(str(abs(x))[::-1])
return rst if -(2**31)-1 < rst < 2**31 else 0
Comments