-
题目1:创建目标数组.给你两个整数数组 nums 和 index。你需要按照以下规则创建目标数组: # 目标数组 target 最初为空。 # 按从左到右的顺序依次读取 nums[i] 和 index[i],在 target 数组中的下标 index[i] 处插入值 nums[i] 。 # 重复上一步,直到在 nums 和 index 中都没有要读取的元素。 # 请你返回目标数组。 # 题目保证数字插入位置总是存在。
- 解释:给定两个整数数组
nums
和index
,我们需要生成一个目标数组target
。这个数组开始为空。我们按顺序将nums[i]
插入到target
的index[i]
位置,直到遍历完所有元素。 - 题解:
def createTargetArray(nums, index):target = [] # 初始化空目标数组for i in range(len(index)): # 遍历索引数组target.insert(index[i], nums[i]) # 在指定位置插入相应的值return target # 返回生成的目标数组# 测试函数 print(createTargetArray([0, 1, 2, 3, 4], [0, 1, 2, 2, 1]))
- 解释:给定两个整数数组
-
题目2:求步数
给你一个非负整数 num ,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。
- 解释:给定一个非负整数
num
,计算将其变为0所需的步数。如果当前数字是偶数,则将其除以2;如果是奇数,则减去1。 - :
def numberOfSteps(num):count = 0 # 步数计数器while num != 0: # 当num不为0时if num % 2 == 0: # 如果是偶数num = num / 2 # 除以2else: # 如果是奇数num = num - 1 # 减去1count += 1 # 步数加1return count # 返回步数# 测试函数 print(numberOfSteps(14))
- 解释:给定一个非负整数
-
题目3:检查整数关系
给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。
- 解释:给定一个整数数组
arr
,检查是否存在两个整数N和M,使得N是M的两倍(即N=2×M)。 - 题解:
def checkIfExist(arr):for i in range(len(arr)): # 遍历每个元素for j in range(i + 1, len(arr)): # 遍历后续元素if arr[j] == arr[i] * 2 or arr[i] == arr[j] * 2: # 检查两倍关系return True # 若存在,返回Truereturn False # 不存在,则返回False# 测试函数 print(checkIfExist([-10, 12, -20, -8, 15]))
- 解释:给定一个整数数组
-
题目4:统计小于当前数字的数
给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。 # 换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] < nums[i] 。 # 以数组形式返回答案。
- 解释:对于每个元素
nums[i]
,统计数组中比它小的所有数字的数量。有效的j
的数量满足j≠i且nums[j]<nums[i]。 - 题解:
def smallerNumbersThanCurrent(nums):list1 = [] # 初始化结果列表for i in range(len(nums)): # 遍历每个元素count = 0 # 小于当前数字的计数器for j in range(len(nums)): # 检查所有元素if nums[j] < nums[i]: # 如果小于当前元素count += 1 # 计数加1list1.append(count) # 将计数添加到结果列表return list1 # 返回结果列表# 测试函数 print(smallerNumbersThanCurrent([8, 1, 2, 2, 3]))
- 解释:对于每个元素
-
题目5:生成奇数次字符的字符串
给你一个整数 n,请你返回一个含 n 个字符的字符串,其中每种字符在该字符串中都恰好出现 奇数次 。 # 返回的字符串必须只含小写英文字母。如果存在多个满足题目要求的字符串,则返回其中任意一个即可。
- 解释:给定一个整数n,生成一个长度为n的字符串,使得每种字符在字符串中恰好出现奇数次。返回的字符串必须只含小写英文字母。
- 题解:
def generateTheString(n):if n % 2 == 0: # 如果n为偶数return "a" * (n - 1) + "b" # 返回n-1个'a'和1个'b'else:if n == 1: # 特殊情况n为1return "a" # 返回'a'else:return "a" * (n - 2) + "b" + "c" # 返回n-2个'a',1个'b'和1个'c'# 测试函数 print(generateTheString(4))
-
题目6:计算最小初始值
给你一个整数数组 nums 。你可以选定任意的 正数 startValue 作为初始值。 # 你需要从左到右遍历 nums 数组,并将 startValue 依次累加上 nums 数组中的值。 # 请你在确保累加和始终大于等于 1 的前提下,选出一个最小的 正数 作为 startValue 。
- 解释:给定整数数组
nums
,选择一个正数startValue
作为初始值,确保从左到右累加nums
数组的值始终大于等于1,找到最小的正数作为startValue
。 - 题解:
def minStartValue(nums):i = 1 # 从1开始while True: # 循环直到找到合适的startValuesum = i # 初始化sum为startValuefor j in range(len(nums)): # 遍历数组sum += nums[j] # 累加if sum < 1: # 如果累加和小于1break # 退出当前循环if j == len(nums) - 1: # 如果到达末尾return i # 返回startValuei += 1 # 增加startValue# 测试函数 print(minStartValue([-3, 2, -3, 4, 2]))
- 解释:给定整数数组
-
题目7:统计最多糖果的孩子
有 n 个有糖果的孩子。给你一个数组 candies,其中 candies[i] 代表第 i 个孩子拥有的糖果数目,和一个整数 extraCandies 表示你所有的额外糖果的数量。 # 返回一个长度为 n 的布尔数组 result,如果把所有的 extraCandies 给第 i 个孩子之后,他会拥有所有孩子中 最多 的糖果,那么 result[i] 为 true,否则为 false。 # 注意,允许有多个孩子同时拥有 最多 的糖果数目。
- 解释:给定一个数组
candies
和整数extraCandies
,返回一个布尔数组,表示每个孩子在获得extraCandies
后能否拥有最多的糖果。 - 题解:
def kidsWithCandies(candies, extraCandies):result = [] # 初始化结果列表max_candies = max(candies) # 找到当前最多的糖果数for i in candies: # 遍历每个孩子的糖果数if i + extraCandies >= max_candies: # 判断是否能拥有最多的糖果result.append(True) # 能则加入Trueelse:result.append(False) # 否则加入Falsereturn result # 返回结果列表# 测试函数 print(kidsWithCandies([4, 2, 1, 1, 2], 1))
- 解释:给定一个数组
-
题目8:寻找旅行终点站
给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 cityBi 。 # 请你找出这次旅行的终点站,即没有任何可以通往其他城市的线路的城市。 # 题目数据保证线路图会形成一条不存在循环的线路,因此恰有一个旅行终点站。
- 解释:给定旅行线路图,用数组
paths
表示,找出没有可以通往其他城市的线路的城市,即旅行的终点站。 - 题解:
def destCity(paths):# 使用集合来存储所有出发城市start_cities = set(path[0] for path in paths)for path in paths: # 遍历每条路径if path[1] not in start_cities: # 如果目的城市不在出发城市中return path[1] # 返回该城市作为终点站# 测试函数 print(destCity([["B", "C"], ["D", "B"], ["C", "A"]]))
- 解释:给定旅行线路图,用数组
-
题目9:查询时间内做作业的学生人数
给你两个整数数组 startTime(开始时间)和 endTime(结束时间),并指定一个整数 queryTime 作为查询时间。 # 已知,第 i 名学生在 startTime[i] 时开始写作业并于 endTime[i] 时完成作业。 # 请返回在查询时间 queryTime 时正在做作业的学生人数。形式上,返回能够使 queryTime 处于区间 [startTime[i], endTime[i]](含)的学生人数。
- 解释:给定开始时间和结束时间数组,查询某个时间点有多少学生在做作业。
- 题解:
def busyStudent(startTime, endTime, queryTime):count = 0 # 学生计数器for i in range(len(startTime)): # 遍历每个学生if startTime[i] <= queryTime <= endTime[i]: # 判断查询时间是否在作业时间范围内count += 1 # 在范围内则计数加1return count # 返回计数结果# 测试函数 print(busyStudent([9, 8, 7, 6, 5, 4, 3, 2, 1], [10, 10, 10, 10, 10, 10, 10, 10, 10], 5))
-
题目10:计算动态和
给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。 # 请返回 nums 的动态和。
- 解释:给定数组
nums
,计算其动态和,即每个位置的累计和。 - 题解:
def runningSum(nums):list1 = [] # 初始化结果列表sum = 0 # 累计和初始化for i in range(len(nums)): # 遍历每个元素sum += nums[i] # 累加list1.append(sum) # 将当前的累加和加入结果列表return list1 # 返回结果列表# 测试函数 print(runningSum([3, 1, 2, 10, 1]))
- 解释:给定数组
-
题目11:最大数和次大数的乘积
找出最大数和次大数分别减一后相乘
- 解释:找出数组中最大值和次大值减一后的乘积。计算公式为: (max−1)×(second max−1)
- 题解:
def maxProduct(nums):nums.sort() # 排序return (nums[-1] - 1) * (nums[-2] - 1) # 返回乘积# 测试函数 print(maxProduct([3, 4, 5, 2]))
-
题目12:好数对计数
给你一个整数数组 nums 。 # 如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。返回好数对的数目。
- 解释:返回数组中满足条件的好数对的数量。好数对的定义是(i,j)满足nums[i]=nums[j]且i<j。
- 题解:
def numIdenticalPairs(nums):count = 0 # 好数对计数器for i in range(len(nums)):for j in range(i + 1, len(nums)):if nums[i] == nums[j]: # 检查是否为好数对count += 1 # 计数加1return count # 返回好数对数量# 测试函数 print(numIdenticalPairs([1, 1, 1, 1]))
-
题目13:折扣后的价格
给你一个数组 prices ,其中 prices[i] 是商店里第 i 件商品的价格。 # 商店里正在进行促销活动,如果你要买第 i 件商品,那么你可以得到与 prices[j] 相等的折扣, # 其中 j 是满足 j > i 且 prices[j] <= prices[i] 的 最小下标 ,如果没有满足条件的 j ,你将没有任何折扣。 # 请你返回一个数组,数组中第 i 个元素是折扣后你购买商品 i 最终需要支付的价格。
- 解释:根据给定价格计算折扣后的价格,如果存在满足条件的j,则折扣为prices[j],否则不折扣。
- 题解:
def finalPrices(prices):list1 = [] # 初始化结果列表for i in range(len(prices)):discount = 0 # 折扣初始化为0for j in range(i + 1, len(prices)): # 查找后续商品if prices[j] <= prices[i]: # 若找到折扣discount = prices[j] # 设置折扣break # 找到后退出循环list1.append(prices[i] - discount) # 计算最终价格return list1 # 返回结果列表# 测试函数 print(finalPrices([8, 4, 6, 2, 3]))
-
题目14:等差数列检查
给你一个数字数组 arr 。 # 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。 # 如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。
- 解释:判断数组是否能够重新排列为等差数列,如果任意相邻两项的差总等于同一个常数,则称为等差数列。
- 题解:
def canMakeArithmeticProgression(arr):arr.sort() # 排序ad = arr[1] - arr[0] # 计算公差for i in range(len(arr) - 1):if arr[i + 1] - arr[i] != ad: # 检查公差return False # 不符合则返回Falsereturn True # 若符合则返回True# 测试函数 print(canMakeArithmeticProgression([3, 4, 1]))
-
题目15:重排列字符串
给你一个字符串 s 和一个 长度相同 的整数数组 indices 。 # 请你重新排列字符串 s ,其中第 i 个字符需要移动到 indices[i] 指示的位置。 # 返回重新排列后的字符串。
- 解释:根据数组
indices
重新排列字符串s
,使得第i个字符移动到indices[i]
指定的位置。 - 题解:
def restoreString(s, indices):list1 = [""] * len(s) # 初始化空列表for i in range(len(s)): # 遍历字符串list1[indices[i]] = s[i] # 按照指定位置重新排列return ''.join(list1) # 返回重新排列后的字符串# 测试函数 print(restoreString("codeleet", [4, 5, 6, 7, 0, 2, 1, 3]))
- 解释:根据数组