欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-04 11:03:59
...

一、题目

题目描述
Leetcode 面试题 01.01. 判定字符是否唯一

二、思路

解法一:
定义一个bool数组,如果某个字符还没出现过则将其添加到列表中,否则退出循环。
解法二:
直接使用set去重,判断去重后的字符串长度与原字符串长度是否相同。
解法三:
采用位运算的方法。
1- 首先定义一个mark,用于存储相应字符对应的位。假设长度为26位,这里我们规定字符’a’为000…000,字符’b’为000…,010,以此类推。
2- 遍历字符串astr,对于每个字符,判断其与起始字符’a’的距离。以字符’l’为例,我们可以先用ord()函数算出当前字符对应的ASCII码值,然后再进行减运算,结果得到11(因为’l’偏离‘a’11个位置),对应000…10000000000。
3- 接着我们用移位运算求出相应字符的十进制数,然后将当前字符与mark进行与运算。
(1)若返回结果等于0,则说明当前字符还没出现过,更新mark,利用或运算将对应下标位的值置为1
(2)若返回结果不等于0,则说明当前字符存在重复字符,直接返回False。
(3)如果当前字符串全部遍历完,则返回True。

左移、右移是指:在二进制中,将1向左、向右移动的位数,返回的是将二进制数转换为十进制数的结果。
两个整型变量的与运算结果是将其转化成二进制位进行逐位的比较。只要有一位不相同,则返回0,否则为非0数。

三、代码

class Solution:
	def isUnique(self, astr: str) -> bool:
  		# 解法三
    	mark = 0  # python默认整型变量位数大于26位
    	for char in astr:
      		move_bit = ord(char) - ord('a')  # ord返回当前字符的ASCII码值
      		if (mark & (1 << move_bit)) != 0:
        		return False
      		else:
        		mark |= (1 << move_bit)
    	return True
		# 解法二
		# return len(set(astr)) == len(astr)
		# 解法一
    	# temp = []
    	# for s in astr:
        	# if s in temp:
            	# return False
        	# else:
            	# temp.append(s)
    	# return True

四、时间复杂度分析

线性遍历,所以时间复杂度为:O(n)

相关标签: 编程题