以下為我的天梯積分規則:
每日至少一題:一題積分+10分
若多做了一題(或多一種方法解答),則當日積分+20分(+10+10)
若做了三道以上,則從第三題開始算+20分(如:做了三道題則積分-10+10+20=40;做了四道題則積分–10+10+20+20=60)
初始分為100分
若差一天沒做題,則扣積分-10分(周六、周日除外注:休息)
堅持!!!
初級算法
刷題目錄
字元串
題幹
給定一個字元串,找到它的第一個不重複的字元,并傳回它的索引。如果不存在,則傳回 -1。
示例:
s = “leetcode”
傳回 0
s = “loveleetcode”
傳回 2
提示:你可以假定該字元串隻包含小寫字母。
哈希表
分析:
本題找到不重複的字元,很明顯的暗示,讓我們用字典,哈希表來解題。通過字典确定每個字元的個數,然後再選出隻有單次出現的字元,且選出最先出現的,傳回其相對應的索引号。
class Solution:
def firstUniqChar(self, s: str) -> int:
# 哈希表
hashmap = {}
for i in s:
if i not in hashmap:
hashmap.update({i:s.count(i)}) # 将數字各自出現的個數存入哈希表中
for key,value in hashmap.items(): # 周遊哈希表的鍵值
if hashmap[key] == 1:
return s.index(key)
return -1
哈希表的速度表現還不錯的!~
索引count
我們還可以将字元串取為單個字元成list後,通過count計數,看在其中的個數是多少,周遊所有項,删除多餘的項,若大于1,則不傳回;若僅有一個字元,則傳回其對應的索引号。若不存在,則傳回-1.
class Solution:
def firstUniqChar(self, s: str) -> int:
# 将s中的單個字母取出來為單個字元串
list1 = list(map(str, s))
n = len(list1)
temp = 0
list2 = list(map(str, s))
for i in list1:
if list1.count(i) > 1:
list2.remove(i) # 如果有,則删除list2裡的對應值
# 判斷是否存在上述情況
for j in list1:
if list1.count(j) == 1:
temp += 1
if temp > 0:
return list1.index(list2[0]) # 查詢list2中删除完
return -1
額,勇氣可嘉,超出時間限制了,感覺不應該的啊
我們再進行優化一下
将temp的判斷再細化一下
不周遊所有直接讀取list2的參數,看是否删除了相同的值之後還存在值,如果還有則,傳回第一個,如果沒有,則傳回-1。
class Solution:
def firstUniqChar(self, s: str) -> int:
# 将s中的單個字母取出來為單個字元串
list1 = list(map(str, s))
n = len(list1)
list2 = list(map(str, s))
for i in list1:
if list1.count(i) > 1:
list2.remove(i) # 如果有,則删除list2裡的對應值
# 判斷是否存在上述情況
if len(list2) > 0:
return list1.index(list2[0]) # 查詢list2中删除完
return -1
還是太菜了,超出時間限制了
不過肯定是能用的。
咱們隻用内置函數試試
class Solution:
def firstUniqChar(self, s: str) -> int:
for i in range(len(s)):
if s.count(s[i]) == 1:
return i
return -1
實時證明,确實很慢很慢,不考慮了。
兩次周遊
我們可以使用兩次周遊來輸出,第一次周遊,将每個數字出現的次數儲存在一個list中,第二次周遊這個list,如果一遇到值為1,則輸出1所在的索引值,否則,傳回-1.
class Solution:
def firstUniqChar(self, s: str) -> int:
c1 = []
n = len(s)
for i in range(n):
c1.append(s.count(s[i]))
for j in range(n):
if c1[j] == 1:
return j
return -1
勇氣可嘉,怎麼還是超出時間限制啊o(╥﹏╥)o
find和rfind
此法骨骼極其清奇,簡直不要太妙了。一個從前查找,一個從後查找,如果下标相等,說明隻出現了一次
class Solution:
def firstUniqChar(self, s: str) -> int:
for x in s:
if s.find(x) == s.rfind(x):
return s.find(x)
return -1