1.判定字符是否唯一-java实现

刷题发现还有一个面试题模块,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;
    }
image.png

实现很简单,效率也很快,就是用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;
    }
image.png

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;
    }
image.png

你可能感兴趣的:(1.判定字符是否唯一-java实现)