本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《367. 有效的完全平方数、383. 赎金信、387. 字符串中的第一个唯一字符、389. 找不同》。
367. 有效的完全平方数
题目描述
给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。
不能使用任何内置的库函数,如 sqrt 。
示例 1:
输入:num = 16 输出:true 解释:返回 true ,因为 4 * 4 = 16 且 4 是一个整数。
示例 2:
输入:num = 14 输出:false 解释:返回 false ,因为 3.742 * 3.742 = 14 但 3.742 不是一个整数。
解题思路
依然是暴力循环,注意range的取值范围,因为是平方,所有只要到16就可以了,如果选择更大的数不仅没有意义,而且会超出时间限制。
解题代码
def isPerfectSquare(num):
for i in range(1,2**16):
if i**2 == num:
return True
return False
383. 赎金信
题目描述
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
示例 1:
输入:ransomNote = "a", magazine = "b" 输出:false
示例 2:
输入:ransomNote = "aa", magazine = "ab" 输出:false
示例 3:
输入:ransomNote = "aa", magazine = "aab" 输出:true
解题思路
首先用集合判断,是不是ransomNote中的元素在magazine都出现了,也就是集合相交还等于randomnote的集合。然后就是判断,每个元素在ransomnote中出现的次数是不是都小于magazine中出现的次数,如果不是返回False。两个检测都通过的话,返回True。
解题代码
def canConstruct(ransomNote:str,magazine:str):
if set(ransomNote)&set(magazine) != set(ransomNote):
return False
else:
for i in set(ransomNote):
if ransomNote.count(i) > magazine.count(i):
return False
return True
387. 字符串中的第一个唯一字符
题目描述
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。
示例 1:
输入: s = "leetcode" 输出: 0
示例 2:
输入: s = "loveleetcode" 输出: 2
示例 3:
输入: s = "aabb" 输出: -1
解题思路
这个还是比较简单的,直接暴力循环,在s中数每一个i,如果等于1的话就返回索引,如果遍历完都不是1的话返回-1。
解题代码
def firstUniqChar(s: str):
for i in s:
if s.count(i) == 1:
return s.index(i)
else:
return -1
389. 找不同
题目描述
给定两个字符串 s 和 t ,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例 1:
输入:s = "abcd", t = "abcde" 输出:"e" 解释:'e' 是那个被添加的字母。
示例 2:
输入:s = "", t = "y" 输出:"y"
解题思路
用集合的补集,直接作差就可以得出后来增加的元素。
解题过程
def findTheDifference(self, s: str, t: str) -> str:
if s== "":
return t
else:
return str(set(t) - set(s))[2]
忽略了如果添加的元素本身就在原来的字符串中出现的这种情况,所以还是用暴力循环来写,遍历t,如果t中的i出现次数比s中多一次,那么这个i就是后来添加的元素。
def findTheDifference(s: str, t: str):
if s == "":
return t
else:
for i in t:
if t.count(i) - s.count(i) == 1:
return i