为什么这个 Python 解决方案不是原地解决方案?
Why this Python solution is not in-place solution?
我在一次采访中被问到这个问题。我得到招聘人员的反馈说我没有到位解决这个问题。我想知道为什么这个解决方案没有到位?我在这里错过了什么?
输入的字符列表如['h','o','w',' ','a','r','e' ,' ','y','o','u','?']。
输出应该是一个字符串,如 ?you are how.
charArr = ['h','o','w',' ','a','r','e',' ','y','o','u','?']
#output = ?you are how
class Solution():
def reverseStr(self,charArr):
charArr = ''.join(charArr).split()[::-1]
for i in range(len(charArr)):
if not charArr[i][-1].isalnum():
charArr[i] = charArr[i][-1] + charArr[i][:-1]
print ' '.join(charArr)
s1 = Solution()
s1.reverseStr(charArr)
就地解决方案永远不会为作为参数传递的列表分配新值,因为如果你这样做,调用者传递的列表的值在调用后不会改变。
您可以看到,在您发布的代码之后执行 print(charArr)
时:它只会打印原始列表。
您可以使用 reverse()
方法反转列表中的值。语法 list[start:end] = ...
也可用于就地改变列表。
这里是您可以正确解决挑战的方法:
def reverseStr(charArr):
charArr.reverse() # this is in-place
start = 0
for end in range(1, len(charArr)+1):
if end >= len(charArr) or charArr[end].isalnum() != charArr[end-1].isalnum():
charArr[start:end] = charArr[start:end][::-1] # in-place reversal of word
start = end
charArr = ['h','o','w',' ','a','r','e',' ','y','o','u','?']
reverseStr(charArr)
print (charArr) # important to test that charArr changed == proof of "in-place"
我在一次采访中被问到这个问题。我得到招聘人员的反馈说我没有到位解决这个问题。我想知道为什么这个解决方案没有到位?我在这里错过了什么?
输入的字符列表如['h','o','w',' ','a','r','e' ,' ','y','o','u','?']。 输出应该是一个字符串,如 ?you are how.
charArr = ['h','o','w',' ','a','r','e',' ','y','o','u','?']
#output = ?you are how
class Solution():
def reverseStr(self,charArr):
charArr = ''.join(charArr).split()[::-1]
for i in range(len(charArr)):
if not charArr[i][-1].isalnum():
charArr[i] = charArr[i][-1] + charArr[i][:-1]
print ' '.join(charArr)
s1 = Solution()
s1.reverseStr(charArr)
就地解决方案永远不会为作为参数传递的列表分配新值,因为如果你这样做,调用者传递的列表的值在调用后不会改变。
您可以看到,在您发布的代码之后执行 print(charArr)
时:它只会打印原始列表。
您可以使用 reverse()
方法反转列表中的值。语法 list[start:end] = ...
也可用于就地改变列表。
这里是您可以正确解决挑战的方法:
def reverseStr(charArr):
charArr.reverse() # this is in-place
start = 0
for end in range(1, len(charArr)+1):
if end >= len(charArr) or charArr[end].isalnum() != charArr[end-1].isalnum():
charArr[start:end] = charArr[start:end][::-1] # in-place reversal of word
start = end
charArr = ['h','o','w',' ','a','r','e',' ','y','o','u','?']
reverseStr(charArr)
print (charArr) # important to test that charArr changed == proof of "in-place"