判断字符数组中是否所有字符都只出现过一次

题目

给定一个字符类型数组,判断数组中是否所有的字符都只出现过一次。

要求时间复杂度O(N)

思路

使用字典存储出现过的字符,遍历数组过程中,判断每一个字符是否出现过

实现

def is_unique(s):
    if s is None:
        return True

    char_map = {}
    for c in s:
        if c in char_map:
            return False
        char_map[c] = True

    return True

测试

牛客网

要求空间复杂度O(1)

思路1,排序

def is_unique2(s):
    if s is None:
        return True

    sorted_s = sorted(s)
    for i in range(1, len(sorted_s)):
        if sorted_s[i] == sorted_s[i-1]:
            return False

    return True

自己实现堆排序

def heap_sort(arr):
    def left(index):
        return index*2 + 1

    def right(index):
        return index*2 + 2

    def heapify(arr, index, size):
        left_child = left(index)
        right_child = right(index)

        largest = index
        if left_child < size and arr[left_child] > arr[largest]:
            largest = left_child
        if right_child < size and arr[right_child] > arr[largest]:
            largest = right_child

        if largest != index:
            arr[largest], arr[index] = arr[index], arr[largest]
            heapify(arr, largest, size)

    def build_heap(arr):
        for i in range(len(arr)//2, -1, -1):
            heapify(arr, i, len(arr))

    build_heap(arr)
    for i in range(len(arr)-1, 0, -1):
        arr[0], arr[i] = arr[i], arr[0]
        heapify(arr, 0, i)
def is_unique3(s):
    if s is None:
        return True

    chars = list(s)
    heap_sort(chars)
    for i in range(1, len(chars)):
        if chars[i] == chars[i-1]:
            return False

    return True

思路2,使用set

def is_unique4(s):
    if s is None:
        return True

    return len(set(s)) == len(s)

测试

def test_heap_sort(count):
    arr = [i for i in range(count)]
    random.shuffle(arr)
    heap_sort(arr)
    assert(sorted(arr) == arr)


def test_is_unique():
    assert(is_unique('') is True)
    assert(is_unique('a') is True)
    assert(is_unique('ab') is True)
    assert(is_unique('abcd') is True)
    assert(is_unique('aa') is False)
    assert(is_unique('aba') is False)
    assert(is_unique('abbcde') is False)

    assert(is_unique2('') is True)
    assert(is_unique2('a') is True)
    assert(is_unique2('ab') is True)
    assert(is_unique2('abcd') is True)
    assert(is_unique2('aa') is False)
    assert(is_unique2('aba') is False)
    assert(is_unique2('abbcde') is False)

    assert(is_unique3('') is True)
    assert(is_unique3('a') is True)
    assert(is_unique3('ab') is True)
    assert(is_unique3('abcd') is True)
    assert(is_unique3('aa') is False)
    assert(is_unique3('aba') is False)
    assert(is_unique3('abbcde') is False)

    for i in range(100):
        size = random.randint(0, 26)
        s = ''.join(random.sample(string.ascii_letters+string.digits, size))
        assert(is_unique(s) == is_unique2(s))
        assert(is_unique2(s) == is_unique3(s))
        assert(is_unique3(s) == is_unique4(s))

    print('done')


if __name__ == '__main__':
    test_heap_sort(5)
    test_heap_sort(50)
    test_heap_sort(500)
    test_is_unique()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值