刷题发现还有一个面试题模块,109个题,优先刷这里吧
第一题:判定字符是否唯一
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
示例 1:
输入: s = "leetcode"
输出: false
示例 2:
输入: s = "abc"
输出: true
限制:
0 <= len(s) <= 100
如果你不使用额外的数据结构,会很加分。
V1版本
这题一看就很方便实现,一个Set就能解决,
不过有个限制是不使用额外的数据结构,会很加分,这个留到V2吧
代码如下
public boolean isUnique(String astr) {
if (astr == null || "".equals(astr)) {
return true;
}
Set set = new HashSet<>();
for (int i = 0; i < astr.length(); i++) {
if (!set.add(astr.charAt(i))) {
return false;
}
}
return true;
}
实现很简单,效率也很快,就是用hashset废点空间
V2版本
不使用额外的数据结构,那就用数组吧,考虑字符只有字母的情况
字母A对应char code为65
字母z对应char code为122
定义一个大小为58的的数组,默认全填充为-1
每获取一个字符,添加进数组中,填充时如果值不为-1则说明重复了
代码如下
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;
}
V3版本
看了下评论区的实现,V2版本是我理解错了,不使用额外的数据结构是连数组也不能使用
参考了indexOf解法,一个字符从前向后查找和从后向前查,出现的位置都一样
代码如下
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;
}