**問題描述**
請實現一個算法,確定一個字符串的所有字符【是否全都不同】。這里我們要求【不允許使用額外的存儲結構】。 給定一個 string,請返回一個 bool 值,true 代表所有字符全都不同,false 代表存在相同的字符。 保證字符串中的字符為【ASCII 字符】。字符串的長度小于等于【3000】。
**解題思路**
這里有幾個重點,第一個是`ASCII字符`,`ASCII字符`字符一共有 256 個,其中 128 個是常用字符,可以在鍵盤上輸入。128 之后的是鍵盤上無法找到的。
然后是全部不同,也就是字符串中的字符沒有重復的,再次,不準使用額外的儲存結構,且字符串小于等于 3000。
如果允許其他額外儲存結構,這個題目很好做。如果不允許的話,可以使用 golang 內置的方式實現。
**源碼參考**
通過`strings.Count`函數判斷:
~~~
func isUniqueString(s string) bool {
if strings.Count(s,"") > 3000{
return false
}
for _,v := range s {
if v > 127 {
return false
}
if strings.Count(s,string(v)) > 1 {
return false
}
}
return true
}
~~~
通過`strings.Index`和`strings.LastIndex`函數判斷:
~~~
func isUniqueString2(s string) bool {
if strings.Count(s,"") > 3000{
return false
}
for k,v := range s {
if v > 127 {
return false
}
if strings.Index(s,string(v)) != k {
return false
}
}
return true
}
~~~
**源碼解析**
以上兩種方法都可以實現這個算法。
第一個方法使用的是 golang 內置方法`strings.Count`,可以用來判斷在一個字符串中包含的另外一個字符串的數量。
第二個方法使用的是 golang 內置方法`strings.Index`和`strings.LastIndex`,用來判斷指定字符串在另外一個字符串的索引未知,分別是第一次發現位置和最后發現位置。
- Golnag常見面試題目解析
- 交替打印數組和字母
- 判斷字符串中字符是否全都不同
- 翻轉字符串
- 判斷兩個給定的字符串排序后是否一致
- 字符串替換問題
- 機器人坐標計算
- 語法題目一
- 語法題目二
- goroutine和channel使用一
- 實現阻塞讀的并發安全Map
- 定時與 panic 恢復
- 高并發下的鎖與map讀寫問題
- 為 sync.WaitGroup 中Wait函數支持 WaitTimeout 功能.
- 七道語法找錯題目
- golang 并發題目測試
- 記一道字節跳動的算法面試題
- 多協程查詢切片問題
- 對已經關閉的的chan進行讀寫,會怎么樣?為什么?
- 簡單聊聊內存逃逸?
- 字符串轉成byte數組,會發生內存拷貝嗎?
- http包的內存泄漏