面试题 01.01. 判定字符是否唯一

    科技2024-03-12  90

    1.题目2.思路与实现4.总结思路与解法4.相关知识

    1.题目

    实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

    示例 1:

    输入: s = “leetcode” 输出: false 示例 2:

    输入: s = “abc” 输出: true 限制:

    0 <= len(s) <= 100 如果你不使用额外的数据结构,会很加分。

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/is-unique-lcci 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    2.思路与实现

    1.哈希表 将字符依次存入哈希表中,遇到已经存在的字符返回

    class Solution { public boolean isUnique(String astr) { if(astr.length() == 0 || astr.length() == 1) return true; Map<Character, Integer> dic = new HashMap<>(); for(int i = 0; i < astr.length(); i++) { if( dic.containsKey(astr.charAt(i))) return false; dic.put(astr.charAt(i), 0); } return true; } }

    时间N 空间N 2.暴力解法 双循环判断,在此不做赘述 时间N2 空间1

    4.总结思路与解法

    1.位运算 将一个变量mark的二进制形式来表示字符是否出现:int型占32个bit,可以看作32个0,就可以对应32个字符,对于一个字符,检查对应的下标是否为0 就可以判断是否已经存在 其实是将二进制表示看作一个数组 检查: 1.算出字符ch:‘d’对应于基准字符(假设为’a’)的距离move_bit为3 2.将1左移3位得到0000…01000(1<< move_bit) 3.上数与mark做与运算&(mark & 1<< move_bit),由于只有一位是1,所以与运算结果若为0,则这个位上已经存在数字0,对应字符没有出现过 若不为0,为8, 则第四个位上是数字1,对应字符已经存在,取log以2为底8的对数即可得到距离,可以反推出字符 未出现的字符通过与运算mark |= 1<< move_bit来将对应位置置为1

    class Solution { public boolean isUnique(String astr) { int mark = 0; for(int i = 0; i < astr.length(); i++ ) { int move_bit = astr.charAt(i) - 'a'; if( (mark & (1 << move_bit)) != 0 ) return false; mark |= 1 << move_bit; } return true; } }

    注意(mark & (1 << move_bit)) != 0的括号不可省略,在无法确定运算先后顺序时加上括号是最稳妥的方法 时间N 空间1 纯字母:26,int就可以存储 大小写字母:54,long ASCII表,128个 两个long存储

    2.String类的indexOf()方法:找到第一次出现指定字符的角标,遍历一个数字就查找后面是否还有角标,实质上是双循环 3.String类的indexOf()和lastIndexOf():找到第一次出现指定字符的角标和最后一次出现字符的角标,判断是否相同,实质上还是双循环

    4.相关知识

    & 与运算符,两个数字做与运算指的是相应的二进制,按照对应位置进行与运算,1为真,0为假,一假即假| 或运算符,两个数字做或运算指的是相应的二进制,按照对应位置进行或运算,1为真,0为假,一真即真
    Processed: 0.027, SQL: 8