为什么此Python解决方案不是就地解决方案?

时间:2018-08-22 14:34:29

标签: python string in-place

在一次采访中有人问我这个问题。我从招聘人员那里得到反馈,说我没有就地解决这个问题。我想知道为什么没有这个解决方案?我在这里想念什么?

输入的是字符列表,例如['h','o','w',','a','r','e','','y','o','u ','?']。 输出应为类似“你是怎么回事”的字符串。

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)

1 个答案:

答案 0 :(得分:0)

就地解决方案永远不会为作为参数传递的列表分配新值,因为如果您这样做,则在调用之后,调用者传递的列表的值将不会更改。

您可能会发现,在发布代码之后执行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"