Python每日一练(20230301) 只出现一次数字、连续增加数字、最短回文串

文章提供了三个编程问题的解决方案,包括在数组中找出唯一出现一次的数字,以特定格式处理连续增加的数字序列,以及找到将字符串转化为最短回文串的方法。这些问题涉及到数组操作,遍历,比较和字符串处理等算法知识。

目录

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完全问题,存在多项式复杂度算法:先求出度为奇数的点,用匹配算法算出这些点间的连接方式,然后再用欧拉路径算法求解。这也是图论的问题。

任务分配问题

有一些员工要完成一些任务。各个员工完成不同任务所花费的时间都不同。每个员工只分配一项任务。每项任务只被分配给一个员工。怎样分配员工与任务以使所花费的时间最少?这是线性规划的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hann Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值