题解 | #判断字符是否唯一#

判断字符是否唯一

http://www.nowcoder.com/practice/fb08c63e2c4f4f7dbf41086e46044211

NC229 判断字符是否唯一

哈希+位运算解法。

解法一:HashSet

思路:判断是否全不同,很自然的想到用HashSet来存放遍历的字符

  • 如果HashSet里不存在该字符,就加入
  • 如果存在则表明重复,返回false
  • 遍历结束,返回true
import java.util.*;
 
public class Solution {
    public boolean isUnique (String str) {
        //哈希解法
        HashSet<Character> set = new HashSet<>();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (set.contains(c)) {
                return false;
            } else {
                set.add(c);
            }
        }
        return true;
    }
}

解法二:位运算

思路:假设如果题目中的字符都是字母,每一个字母对应一位,则64位long类型就可以储存所有信息。

  • 创建一个long类型的flag变量(考虑到大小写共54位,64位够了)
  • 遍历字符,转化为0-54的值,如果flag对应的位置已经有数,说明之前重复过,返回false
  • 否则,将字符的值位移到flag变量的对应位置,储存
  • 遍历结束,返回true
import java.util.*;
 
public class Solution {
    public boolean isUnique (String str) {
        //位运算解法
        //1创建一个int数,每次循环取出char再位移char个位
        //2将新的int跟原来int比较,相同则说明之前重复过
        long flag = 0;
        for (int i = 0; i < str.length(); i++) {
            if ((flag >>> getCharVal(str.charAt(i)) & 1) == 1) {
            return false;
        } else {
            flag += 1l << getCharVal(str.charAt(i));
            }
        }
        return true;
    }
  	//辅助函数,区分大小写
    private int getCharVal(char c){
        if (c >= 'A'){
            return c - 'A' + 27;
        }else{
            return c - 'a';
        }
    }
}
全部评论

相关推荐

头像
不愿透露姓名的神秘牛友
05-27 11:41
已编辑
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务