目录
1. 只出现一次的数字
2. 以特殊格式处理连续增加的数字
3. 最短回文串
1. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1] 输出: 1
示例 2:
输入: [4,1,2,1,2] 输出: 4
class Solution:
def singleNumber(self, nums: list) -> int:
nums = sorted(nums)
i = 0
while i < len(nums) - 1:
if nums[i] == nums[i + 1]:
i += 2
else:
return nums[i]
return nums[i]
if __name__ == '__main__':
s = Solution()
print(s.singleNumber([2,2,1]))
print(s.singleNumber([4,1,2,1,2]))
输出:
1
4
2. 以特殊格式处理连续增加的数字
给出一串数字, 程序要把数字按照这样的格式输出,把连续增加的数字用 [x-y] 的形式表示,只显示这一组顺序数字的首位两个数字,不连续增加的数字单独列出。
示例 :
输入: 1, 2, 3, 4, 5, 8, 10, 11, 12, 13, 20, 21, 22 输出: [1-5] [8] [10-13] [20-22]
seq = list(map(int, input().split(',')))
tmp = [seq[0]]
all_list = []
for n in range(len(seq)):
if n == len(seq) - 1:
all_list.append(tmp)
break
if seq[n + 1] - seq[n] == 1:
tmp.append(seq[n + 1])
else:
all_list.append(tmp)
tmp = [seq[n + 1]]
for a in all_list:
if len(a) > 1:
print('[%s-%s]' % (a[0], a[-1]))
else:
print('[%s]' % a[0])
输入输出:
1, 2, 3, 4, 5, 8, 10, 11, 12, 13, 20, 21, 22
[1-5]
[8]
[10-13]
[20-22]
3. 最短回文串
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
示例 1:
输入:s = "aacecaaa" 输出:"aaacecaaa"
示例 2:
输入:s = "abcd" 输出:"dcbabcd"
提示:
0 <= s.length <= 5 * 104
s
仅由小写英文字母组成
class Solution:
def shortestPalindrome(self, s: str) -> str:
N = len(s)
idx1 = 0
for idx2 in range(N - 1, -1, -1):
if s[idx1] == s[idx2]:
idx1 += 1
if idx1 == N:
return s
return s[idx1:][::-1] + self.shortestPalindrome(s[:idx1]) + s[idx1:]
if __name__ == '__main__':
s = Solution()
print(s.shortestPalindrome("aacecaaa"))
print(s.shortestPalindrome("abcd"))
输出:
aaacecaaa
dcbabcd
附录
排列与组合
是组合学最基本的概念。所谓排列,就是指从给定个数的元素中取出指定个数的元素进行排序。组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。
基本原理
⑴加法原理和分类计数法
⒈加法原理:做一件事,完成它可以有n类办法,在第一类办法中有m1种不同的方法,在第二类办法中有m2种不同的方法,……,在第n类办法中有mn种不同的方法,那么完成这件事共有N=m1+m2+m3+…+mn种不同方法。
⒉第一类办法的方法属于集合A1,第二类办法的方法属于集合A2,……,第n类办法的方法属于集合An,那么完成这件事的方法属于集合A1UA2U…UAn。
⒊分类的要求 :每一类中的每一种方法都可以独立地完成此任务;两类不同办法中的具体方法,互不相同(即分类不重);完成此任务的任何一种方法,都属于某一类(即分类不漏)。
⑵乘法原理和分步计数法
⒈ 乘法原理:
做一件事,完成它需要分成n个步骤,做第一步有m1种不同的方法,做第二步有m2种不同的方法,……,做第n步有mn种不同的方法,那么完成这件事共有N=m1×m2×m3×…×mn种不同的方法。
⒉合理分步的要求
任何一步的一种方法都不能完成此任务,必须且只须连续完成这n步才能完成此任务;各步计数相互独立;只要有一步中所采取的方法不同,则对应的完成此事的方法也不同。
3.与后来的离散型随机变量也有密切相关。
著名问题
计算一些物品在特定条件下分组的方法数目。这些是关于排列、组合和整数分拆的。
地图着色问题
对世界地图着色,每一个国家使用一种颜色。如果要求相邻国家的颜色相异,是否总共只需四种颜色?这是图论的问题。
船夫过河问题
船夫要把一匹狼、一只羊和一棵白菜运过河。只要船夫不在场,羊就会吃白菜、狼就会吃羊。船夫的船每次只能运送一种东西。怎样把所有东西都运过河?这是线性规划的问题。
中国邮差问题
由中国组合数学家管梅谷教授提出。邮递员要穿过城市的每一条路至少一次,怎样行走走过的路程最短?这不是一个NP完全问题,存在多项式复杂度算法:先求出度为奇数的点,用匹配算法算出这些点间的连接方式,然后再用欧拉路径算法求解。这也是图论的问题。
任务分配问题
有一些员工要完成一些任务。各个员工完成不同任务所花费的时间都不同。每个员工只分配一项任务。每项任务只被分配给一个员工。怎样分配员工与任务以使所花费的时间最少?这是线性规划的问题。