给定一个目标字符串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'
思路:利用序列切片。对于不需要的目标元素,直接截取除它以外的其他元素。
学委的两个题解都很好,相比之下我的答案有点傻大粗了。
91361317
(happy_baby)
7
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'
lekaixin
(ALe阿乐)
10
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'
QYe
11
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’