本文共 4315 字,大约阅读时间需要 14 分钟。
小明需要找出所有和为100的连续正数序列。例如,9~16的和为100,18,19,20,21,22的和也为100。现在,你需要编写一个函数,找出所有满足条件的连续正数序列,并按照从小到大的顺序输出。
可以使用左右指针法来解决这个问题。左指针从1开始,右指针从2开始。通过不断调整两个指针的位置,计算当前区间的和,直到找到和等于目标值的序列。具体步骤如下:
class Solution: def FindContinuousSequence(self, tsum): i, j, result = 1, 2, [] while j <= (tsum + 1) // 2: current_sum = sum(range(i, j + 1)) if current_sum < tsum: j += 1 elif current_sum > tsum: i += 1 else: result.append(range(i, j + 1)) i += 1 j += 1 return result
给定一个递增排序的数组和一个数字S,找出两个数使得它们的和等于S。如果有多个解,返回乘积最小的那一对(按从小到大的顺序输出)。
使用双指针法,左指针从数组起点开始,右指针从数组终点开始。具体步骤如下:
class Solution: def FindNumbersWithSum(self, array, tsum): if not array: return [] i, j = 0, len(array) - 1 while i < j: current_sum = array[i] + array[j] if current_sum == tsum: return [array[i], array[j]] elif current_sum > tsum: j -= 1 else: i += 1 return []
模拟汇编语言中的循环左移操作,将字符串左移K位。例如,字符串“abcXYZdef”左移3位后变成“XYZdefabc”。
字符串循环左移K位可以通过字符串切片实现。将字符串分为两部分,后半部分加上前半部分即可得到结果。
class Solution: def LeftRotateString(self, s, n): return s[n:] + s[:n]
对句子中的单词顺序进行翻转。例如,“student. a am I”翻转后变成“I am a student.”
将句子拆分成单词列表后,直接反转列表并重新拼接即可得到翻转后的句子。
class Solution: def ReverseSentence(self, s): words = s.split(' ') return ' '.join(words[::-1]) 判断抽出的5张牌是否能组成顺子。大小王可以看作0或4,但在这个问题中视为0和4。
将牌的数字转换为统一的数字(大小王视为0),然后检查是否存在长度为4的连续数字序列。
class Solution: def IsPokerSequence(self, cards): converted = [] for card in cards: if card == '大王': converted.append(0) elif card == '小王': converted.append(4) else: converted.append(int(card)) target = [0, 4, 1, 2, 3, 4] for i in range(len(converted) - 4 + 1): if converted[i:i+5] == target: return True return False
小朋友围成一个大圈,编号从0开始,随机指定一个数m。编号为0的小朋友开始报数,每次m-1的那个小朋友出列。最后剩下的数即为答案。
这个问题可以转化为寻找n-1的最大公约数。最后剩下的数等于起始数m模n的结果。
class Solution: def LastRemainingNumber(self, m, n): if n == 1: return 0 total = m last = total % n return last
要求计算1+2+3+...+n的和,且不能使用乘除法、循环、条件判断等结构。
使用递归的方法,每次计算n-1的和加上n即可得到结果。
class Solution: def Sum_Solution(self, n): if n == 1: return 1 return self.Sum_Solution(n - 1) + n
两个整数之和,不能使用+、-、*、/运算符。
利用位运算和进位的方法,逐位计算两个数的和。
class Solution: def Add(self, num1, num2): result = [] carry = 0 while num1 > 0 or num2 > 0 or carry > 0: sum_bit = num1 % 2 + num2 % 2 + carry carry = sum_bit // 2 result.append(sum_bit % 2) num1 //= 2 num2 //= 2 return result
将字符串转换为整数,不能使用字符串转整数的库函数。非法字符或非法数值返回0。
首先检查字符串是否为空或包含非法字符。然后遍历每个字符,检查是否为数字字符。最后,将字符串转换为整数。
class Solution: def StrToInt(self, s): if s in ['-', '+', '-', '+']: return 0 has_invalid = False for c in s: if c not in '0123456789+-': has_invalid = True break for c in s: if c not in '0123456789': has_invalid = True break if has_invalid: return 0 return int(s) if s else 0
数组中所有数字在0到n-1范围内。找出任意一个重复的数字。
由于数组长度为n,数字范围为0到n-1,至少有一个数字重复。遍历数组,检查每个数字是否与前一个数字相同。
class Solution: def duplicate(self, numbers, duplication): if not numbers: return False for i in range(len(numbers) - 1): if numbers[i] == numbers[i + 1]: duplication[0] = numbers[i] return True return False
转载地址:http://trrh.baihongyu.com/