【每日一题0923】一站到底

:mage:t2:给定一个目标字符串words和一个数字列表nums,其中列表中的数字代表的是需要移除的字符的索引位置。请编写一个函数,找出能坚持到最后的那个字符。

示例:
输入:words=“zbk”, nums=[0, 1],输出 ”b“。

执行过程:(1)移除"zbk"中索引是0的元素,得到words="bk", nums=[1];(2)移除"bk"的索引是1的元素,剩下words="b",nums=[]。nums为空,遍历结束,返回"b"

题目难度:简单
题目来源:codewars

def last_survivor(words: str, nums:list):
    pass

assert last_survivor('Hogw', [1, 1, 1]) == 'H'
assert last_survivor('abc', [0, 1]) == 'b'
assert last_survivor('zbk', [2, 1]) == 'z'
def last_survivor(words: str, nums:list):
    retain = set(range(len(words))).difference(set(nums))
    result = ""
    for i in retain:
        result = result + words[i]
    return result

# assert last_survivor('Hogwarts', [1, 1]) == 'c'  # 这条断言应该有误
assert last_survivor('abc', [0, 1]) == 'c'
assert last_survivor('zbk', [2, 1]) == 'z'
assert last_survivor('b', []) == 'b'
assert last_survivor('bk', [1]) == 'b

\

答复:确实确实,我的问题。翻译题目的时候,对于示例理解有偏差了。原来这个nums数字遍历完一次就不在移除元素了,我之前理解成循环移除直至words只剩一个字母。

原来:assert last_survivor('Hogwarts', [1, 1]) == 'c'
现在:assert last_survivor('Hogw', [1, 1, 1]) == 'H'

原来:assert last_survivor('abc', [0, 1]) == 'c'
现在:assert last_survivor('abc', [0, 1]) == 'b'

感谢提醒,已经自检了一遍,纠正完毕。

参考题解1:

def last_survivor(words: str, nums:list):
    li = list(words)
    for n in nums:
        li.pop(n)
    return ''.join(li)

assert last_survivor('Hogw', [1, 1, 1]) == 'H'
assert last_survivor('abc', [0, 1]) == 'b'
assert last_survivor('zbk', [2, 1]) == 'z'

思路:利用内置函数pop()。将目标索引的元素直接从中剔除,最后返回剩下的独苗~

参考题解2:

def last_survivor(words: str, nums:list):
    for x in nums:
        words = words[0:x] + words[x+1:]
    return words

assert last_survivor('Hogw', [1, 1, 1]) == 'H'
assert last_survivor('abc', [0, 1]) == 'b'
assert last_survivor('zbk', [2, 1]) == 'z'

思路:利用序列切片。对于不需要的目标元素,直接截取除它以外的其他元素。

学委的两个题解都很好,相比之下我的答案有点傻大粗了。 :rofl:

def last_survivor(words: str, nums:list):
    # python的字符串是一种不可变对象(immutabel object),意味着只读不写,这里先转化成list
    t = list(words)
    for i in nums:
        t.pop(i)
    words = "".join(t)
    return words
def test_last_survivor():
    assert last_survivor('Hogw', [1, 1, 1]) == 'H'
    assert last_survivor('abc', [0, 1]) == 'b'
    assert last_survivor('zbk', [2, 1]) == 'z'

JAVA参考题解

public class Kata {

  public static String lastSurvivor(String letters, int[] coords) {
    for (int index : coords) {
      letters = letters.substring(0, index) + letters.substring(index + 1);
    }
    return letters;
  }
}
def last_survivor(words: str, nums: list):
    aa = list(words)
    [aa.pop(i) for i in nums]
    return aa[0]


assert last_survivor('Hogw', [1, 1, 1]) == 'H'
assert last_survivor('abc', [0, 1]) == 'b'
assert last_survivor('zbk', [2, 1]) == 'z'
assert last_survivor('b', []) == 'b'
assert last_survivor('bk', [1]) == 'b'
def last_survivor(words: str, nums:list):
    for i in nums:
        words=words[0:i]+words[i+1:-1]
    return words

assert last_survivor('Hogw', [1, 1, 1]) == 'H'
assert last_survivor('abc', [0, 1]) == 'b'
assert last_survivor('zbk', [2, 1]) == 'z'
def last_survivor(words: str, nums: list):
    lword = list(words)
    print(lword)
    for i in range(0, len(nums)):
        lword.pop(nums[i])
    return lword[0]


assert last_survivor('Hogw', [1, 1, 1]) == 'H'
assert last_survivor('abc', [0, 1]) == 'b'
assert last_survivor('zbk', [2, 1]) == 'z'

def last_survivor(words: str, nums:list):
wordsL = list(words)
for i in nums:
wordsL.pop(i)
return ‘’.join(wordsL)

assert last_survivor(‘Hogw’, [1, 1, 1]) == ‘H’
assert last_survivor(‘abc’, [0, 1]) == ‘b’
assert last_survivor(‘zbk’, [2, 1]) == ‘z’