Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode-判定字符是否唯一
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
示例 1:
输入: s = "leetcode" 输出: false 示例 2:
输入: s = "abc" 输出: true 限制:
0 <= len(s) <= 100 如果你不使用额外的数据结构,会很加分。
二、思路分析:
思路一:
- 首先给的是字符串,字符串可以转为字符数组,方便存入集合中,字符数组的长度即是字符串的长度。
- 使用HashSet,Hashet的特点是不可重复、可以为空,字符串转换为字符数组后,放入Set集合中。
- 全部数据放入集合中后,比较集合以及原来字符串的长度、或者和字符数组长度比较。
- 如果字符数组长度==集合大小 必然没有重复。反之。
思路二:
- 使用ASCII码与位运算的方式求解
- ASCII码字符个数为128个
- 以使用两个64位的long变量来存储是否出现某个字符
- 二进制位1表示出现过, 0表示未出现过
三、AC 代码:
思路一:
class Solution {
public boolean isUnique(String astr) {
char[] chars = astr.toCharArray();
HashSet<Character> characters = new HashSet<>();
for (int i = 0; i < chars.length; i++) {
characters.add(chars[i]);
}
if (characters.size() == chars.length) {
return true;
}
return false;
}
}
思路二:
class Solution {
public boolean isUnique(String astr) {
long low64 = 0;
long high64 = 0;
for (char c : astr.toCharArray()) {
if (c >= 64) {
long bitIndex = 1L << (c - 64);
if ((high64 & bitIndex) != 0) {
return false;
}
high64 |= bitIndex;
} else {
long bitIndex = 1L << c;
if ((low64 & bitIndex) != 0) {
return false;
}
low64 |= bitIndex;
}
}
return true;
}
}
四、总结:
- 如果上来直接写个二重循环搞定,可能只能得到50分
- 多种思路有多重考虑情况,例如:ascii字符集需要有边界检查,并且针对不同的范围有不同的侧重点,比如说ascii字符集,那也就是128个可能性。
- 有些东西一开始没想到不是问题,工作中提示一下即可,但是思维对我们来说更重要。