大学三年都没写过除了hello world之外的代码
突然觉得算法so interesting
#1295 统计位数为偶数的数字
给你一个整数数组 nums
,请你返回其中位数为 偶数 的数字的个数。
思路:
1.将数组中的每一个数字转为字符串
2.获取该字符串的长度
3.如果除以二的余数是0,则sum+1
代码:
class Solution:
def findNumbers(self, nums: List[int]) -> int:
sum = 0
for i in nums:
j = str(i)
if (len(j) % 2) == 0:
sum += 1
return sum
#1450 在既定时间做作业的学生人数
给你两个整数数组 startTime(开始时间)和 endTime(结束时间),并指定一个整数 queryTime 作为查询时间。
已知,第 i 名学生在 startTime[i] 时开始写作业并于 endTime[i] 时完成作业。
请返回在查询时间 queryTime 时正在做作业的学生人数。形式上,返回能够使 queryTime 处于区间 [startTime[i], endTime[i]](含)的学生人数。
思路:
根据queryTime进行判断,一次遍历
代码:
class Solution:
def busyStudent(self, startTime: List[int], endTime: List[int], queryTime: int) -> int:
sum = 0
for i in range(0,len(startTime)):
if startTime[i] <= queryTime <= endTime[i]:
sum += 1
return sum
#1464 数组中两元素的最大乘积
给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。
请你计算并返回该式的最大值。
思路:
1.遍历得出数组中最大的两个元素
2.排序
3.利用remove函数,先提出数组中最大的元素再将其移出,然后再提出此时数组中最大的元素
代码:
class Solution:
def maxProduct(self, nums: List[int]) -> int:
a = max(nums)
nums.remove(a)
b = max(nums)
return (a-1)*(b-1)
剑指Offer 17 打印从1到最大的n位数
输入数字 n
,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
思路:
边遍历边输出,规律是到99,999,9999等等含9的,那就统一成100-1、1000-1、10000-1这种格式再找出100、100、10000等等与n的关系即可
代码:
class Solution:
def printNumbers(self, n: int) -> List[int]:
res = []
for i in range(1,10**n):
res.append(i)
return res
#461 汉明距离
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:
0 ≤ x, y < 2^31.
思路:
原本先把x、y转为二进制再进行异或,但是转为二进制之后前面会有0b标识,影响异或,所以先异或,然后转为二进制,计算该二进制数中有几个1
代码:
class Solution:
def hammingDistance(self, x: int, y: int) -> int:
a = x^y
b = bin(a).count("1")
return b
剑指Offer 56 || 数组中数字出现的次数||
在一个数组 nums
中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
思路:
按位算的没看懂...
我的思路也是很暴力,直接遍历,看哪个元素在数组中出现的次数是1
代码:
class Solution:
def singleNumber(self, nums: List[int]) -> int:
for i in range(len(nums)):
if nums.count(nums[i]) == 1:
return nums[i]
#1528 重新排列字符串
给你一个字符串 s 和一个 长度相同 的整数数组 indices 。
请你重新排列字符串 s ,其中第 i 个字符需要移动到 indices[i] 指示的位置。
返回重新排列后的字符串。
思路:
先创建一个和s一样大的数组,然后遍历,按照整数中的序列值来将s中对应位置的值放入到数组中,最后将数组转为字符串
代码:
class Solution:
def restoreString(self, s: str, indices: List[int]) -> str:
res = list(s)
for i in range(len(s)):
res[indices[i]] = s[i]
return "".join(res)
#1304 和为零的N个唯一整数
给你一个整数 n
,请你返回 任意 一个由 n
个 各不相同 的整数组成的数组,并且这 n
个数相加和为 0
。
思路:
原本是想random产生一个个数为n//2的数组,但是random这个编译器里不知道怎么用...
1.数组的组成:n//2对相反数(或加一个0)
2.先定义一个数组,将从1到n//2的值以及这些值的相反数放进去
3.在判断n的奇偶,如果是奇数,则在数组后面加一个0再返回该数组,若是偶数直接返回该数组
代码:
class Solution:
def sumZero(self, n: int) -> List[int]:
a = []
for i in range(1,n//2+1):
a.append(i)
a.append(-i)
if (n%2 == 0):
return a
else:
a.append(0)
return a
#709 转换成小写字母
实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。
思路:
1.先将字符串转为数组
2.遍历
(原本的思路是直接判断第i个字符是ascii值是不是小于97,是的话就+32,但是后面发现这个字符串可能会含有字符,会影响整体结果,所以采用了'A'<= a[i] <='Z'的方法)
3.采取上方描述的判断方法,若是大写,则将其转为小写
4.最后将数组转为字符串返回
代码:
class Solution:
def toLowerCase(self, str: str) -> str:
a = list(str)
for i in range(len(a)):
if 'A' <= a[i] <= 'Z':
a[i] = chr(ord(a[i]) + 32)
str ="".join(a)
return str
#1323 6和9组成的最大数字
给你一个仅由数字 6 和 9 组成的正整数 num
。
你最多只能翻转一位数字,将 6 变成 9,或者把 9 变成 6 。
请返回你可以得到的最大数字。
思路:
1.先将数字转为字符串再转为数组
2.将数组中出现的第一个6变成9
代码:
class Solution:
def maximum69Number (self, num: int) -> int:
a = list(str(num))
a = list(str(num))
for i in range(len(a)):
if a[i] == '6':
a[i] = '9'
break
a = "".join(a)
a = int(a)