Swift 字符串中的第一個唯一字符 - LeetCode

LeetCode.jpg

題目:字符串中的第一個唯一字符

描述:
給定一個字符串惜颇,找到它的第一個不重復的字符,并返回它的索引恤筛。如果不存在官还,則返回 -1。

案例:

s = "leetcode"
返回 0.

s = "loveleetcode",
返回 2.
一毒坛、可以參照Swift 存在重復 - LeetCode中的哈希表解決方案望伦,記錄字符串出現(xiàn)的索引位置

1林说、將字符串轉(zhuǎn)為數(shù)組
2、循環(huán)字符串數(shù)組屯伞,將字符作為鍵腿箩,索引作為值存入字典
3、存入字典時先判斷是否已經(jīng)存在劣摇,已存在則將值置位-1
4珠移、循環(huán)字典,拿到所有的值
5末融、將值排序(因為都是整數(shù))钧惧,最小值即為所求的索引

class Solution {
    func firstUniqChar(_ s: String) -> Int {
        var charArr = [String]()
        for character in s { //將字符串轉(zhuǎn)為數(shù)組
            charArr.append(String(character))
        }
        var dic = [String: Int]()
        for i in 0..<charArr.count {
            if let _ = dic[charArr[i]] { //當字典內(nèi)已經(jīng)存在該字符,此時直接將其置為-1
                dic[charArr[i]] = -1
            } else {
                dic[charArr[i]] = i //記錄字符出現(xiàn)的索引位置
            }
        }
        var newArray = [Int]()
        //循環(huán)字典勾习,拿到所有的值
        for (_, value) in dic {
            if value != -1 { //將所有補位-1的索引添加到新的數(shù)組中
                newArray.append(value)
            }
        }
        // 如果數(shù)組不為空浓瞪,則取最小值,即第一次出現(xiàn)的索引巧婶,所以排序后取第一個值
        if newArray.count > 0 {
            return newArray.sorted().first!
        }
        return -1
    }
}

但是分析一下算法乾颁。。艺栈。循環(huán)很多英岭,需要創(chuàng)建的輔助變量也很多,同時還要排序湿右,但是個人以為最重要的原因可能是Character轉(zhuǎn)換String耗時較多(ps:求大神解答)诅妹,并且運行效率確實不高,在LeetCode中只戰(zhàn)勝了20%的方案(執(zhí)行用時1016ms)诅需、漾唉、、堰塌、

二赵刑、使用Unicode標量參,考官方網(wǎng)String and Characters
我們可以使用String類型的unicodeScalars屬性遍歷一個Unicode標量編碼的字符串。這個屬性是 UnicodeScalarsView類型场刑,UnicodeScalarsView是一個UnicodeScalar類型的集合般此。每一個Unicode標 量都是一個任意21位Unicode碼位,沒有高位代理牵现,也沒有低位代理铐懊。
每一個UnicodeScalar使用value屬性,返回標量的21位值瞎疼,每一位都是32位無符號整形(UInt32)的值:

參考官方例子:

let dogString = "Dog???"
for scalar in dogString.unicodeScalars {
    print("\(scalar.value) ", terminator: "")
}
print("")
// Prints "68 111 103 8252 128054 "

for scalar in dogString.unicodeScalars {
    print("\(scalar) ")
}
// D
// o
// g
// ?
// ??

我們知道我們小寫字母的ASCII碼值A是從97開始的科乎,所以:
1、先創(chuàng)建一個包含26個0作為值的數(shù)組
2贼急、循環(huán)string的unicodeScalars獲取其value
3茅茂、將value - 97 代表字符捏萍,記錄該字符出現(xiàn)的次數(shù)
4、再次循環(huán)string空闲,獲取第一個出現(xiàn)次數(shù)為1的字符
代碼如下:

 func firstUniqChar(_ s: String) -> Int {
        //創(chuàng)建一個含有26個為0的值的數(shù)組
        var array = Array<Int>(repeating: 0, count: 26)
        for character in s.unicodeScalars {
            let index = Int(character.value - 97)
            //記錄字符出現(xiàn)的次數(shù)
            array[index] = array[index] + 1
        }
        //再次循環(huán)string令杈,使用enumerated()獲取到字符串的索引
        for (index, character) in s.unicodeScalars.enumerated() {
            let count = array[Int(character.value - 97)]
            if count == 1 {
                return index
            }
        }
        return -1
    }
可以看到運行結果如下:

執(zhí)行用時:172ms


運行結果.png
用Swift開始學習算法中,在LeetCode中開始做初級算法這一章節(jié)碴倾,將做的題目在此做個筆記逗噩,希望有更好方法同學們cue我哦。
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末跌榔,一起剝皮案震驚了整個濱河市异雁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌僧须,老刑警劉巖片迅,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扫责,居然都是意外死亡劳跃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逆害,“玉大人,你說我怎么就攤上這事顽染∥堪玻” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵蹋砚,是天一觀的道長扼菠。 經(jīng)常有香客問我,道長坝咐,這世上最難降的妖魔是什么循榆? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮墨坚,結果婚禮上秧饮,老公的妹妹穿的比我還像新娘。我一直安慰自己泽篮,他們只是感情好盗尸,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帽撑,像睡著了一般泼各。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亏拉,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天扣蜻,我揣著相機與錄音逆巍,去河邊找鬼。 笑死弱贼,一個胖子當著我的面吹牛蒸苇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吮旅,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼溪烤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了庇勃?” 一聲冷哼從身側響起檬嘀,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎责嚷,沒想到半個月后鸳兽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡罕拂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年揍异,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爆班。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡衷掷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出柿菩,到底是詐尸還是另有隱情戚嗅,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布枢舶,位于F島的核電站懦胞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凉泄。R本人自食惡果不足惜躏尉,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旧困。 院中可真熱鬧醇份,春花似錦、人聲如沸吼具。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拗盒。三九已至怖竭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陡蝇,已是汗流浹背痊臭。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工哮肚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人广匙。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓允趟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸦致。 傳聞我的和親對象是個殘疾皇子潮剪,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容