刷題發(fā)現(xiàn)還有一個(gè)面試題模塊,109個(gè)題染坯,優(yōu)先刷這里吧
第一題:判定字符是否唯一
實(shí)現(xiàn)一個(gè)算法伞芹,確定一個(gè)字符串 s 的所有字符是否全都不同。
示例 1:
輸入: s = "leetcode"
輸出: false
示例 2:
輸入: s = "abc"
輸出: true
限制:
0 <= len(s) <= 100
如果你不使用額外的數(shù)據(jù)結(jié)構(gòu)鸠踪,會(huì)很加分。
V1版本
這題一看就很方便實(shí)現(xiàn)复斥,一個(gè)Set就能解決营密,
不過(guò)有個(gè)限制是不使用額外的數(shù)據(jù)結(jié)構(gòu),會(huì)很加分永票,這個(gè)留到V2吧
代碼如下
public boolean isUnique(String astr) {
if (astr == null || "".equals(astr)) {
return true;
}
Set<Character> set = new HashSet<>();
for (int i = 0; i < astr.length(); i++) {
if (!set.add(astr.charAt(i))) {
return false;
}
}
return true;
}
image.png
實(shí)現(xiàn)很簡(jiǎn)單卵贱,效率也很快滥沫,就是用hashset廢點(diǎn)空間
V2版本
不使用額外的數(shù)據(jù)結(jié)構(gòu)侣集,那就用數(shù)組吧键俱,考慮字符只有字母的情況
字母A對(duì)應(yīng)char code為65
字母z對(duì)應(yīng)char code為122
定義一個(gè)大小為58的的數(shù)組,默認(rèn)全填充為-1
每獲取一個(gè)字符世分,添加進(jìn)數(shù)組中编振,填充時(shí)如果值不為-1則說(shuō)明重復(fù)了
代碼如下
public boolean isUnique(String astr) {
if (astr == null || "".equals(astr)) {
return true;
}
char A = 'A';
int[] array = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1
};
int num;
for (int i = 0; i < astr.length(); i++) {
num = astr.charAt(i) - A;
if (array[num] != -1) {
return false;
}
array[num] = num;
}
return true;
}
image.png
V3版本
看了下評(píng)論區(qū)的實(shí)現(xiàn),V2版本是我理解錯(cuò)了臭埋,不使用額外的數(shù)據(jù)結(jié)構(gòu)是連數(shù)組也不能使用
參考了indexOf解法踪央,一個(gè)字符從前向后查找和從后向前查,出現(xiàn)的位置都一樣
代碼如下
public boolean isUnique(String astr) {
if (astr == null || "".equals(astr)) {
return true;
}
for (int i = 0; i < astr.length(); i++) {
if (astr.indexOf(astr.charAt(i)) != astr.lastIndexOf(astr.charAt(i))) {
return false;
}
}
return true;
}
image.png