Python学习杂记 交换元素 回文 翻转字符串

本文深入探讨了Python中独特的数据交换技巧,包括中间值法、异或法及Python特有的简洁方式。同时,文章详细介绍了字符串和数组翻转的高效方法,展示了Python的强大与灵活性。

Python学习杂记 交换元素 回文 翻转字符串

  • 交换值常见的方法有
    1. 中间值t交换
    2. a = a + b, b = a - b, a = a - b
    3. 异或法:a = a ^ b, b = a ^ b, a = a ^ b
  • 在python中有一种更加直接,也更python的写法:a, b = b, a
  • python中没有++,–。这是因为python中的数据类型是不可变数据,也就是数字类型数据在内存中不会改变,那么当变量值发生改变,就会重新申请一块内存赋值为新值,然后将变量指向新的内存地址。对比于’+=’;’++’,’–’改变的是对象本身,而不是变量本身,即改变数据地址所指向的内存中的内容,而前者是重新生成一个变量,把操作后的结果赋予新生成的变量。
  • 关于字符串/数组的翻转(也称为倒置),用类似于c语言的方法写也可以,但在python中有更加方便的写法,测试如下:
import numpy as np


def reverse(ss): # ss can be different types
    return ss[::-1]
'''
ss[-1] 可以返回最后一个元素,同理[-2][-3]返回倒数2.3个元素
ss[:-1] 返回除了最后一个元素以外的所有元素,也好理解,python的截断是左闭右开区间式截断
ss[::-1] 返回从最后一个元素开始到第一个元素,即翻转该list
ss[2::-1] 返回从下标2开始向前到第一个的新list:如[1,2,3,4]
调用后则返回[3,2,1]
'''
a = np.random.rand(5)
s = '123456'
cnt = 0
for i in range(len(a)):
    print(i, a[i])
for i in a:
    print(cnt, i)
    cnt += 1 
print(a)
print(s)
print(reverse(reverse(a)))
print(reverse(s))
'''OUTPUT:
1 0.922775893026
2 0.717193412042
3 0.565067219685
4 0.937379724773
0 0.380341348411
1 0.922775893026
2 0.717193412042
3 0.565067219685
4 0.937379724773
[ 0.38034135  0.92277589  0.71719341  0.56506722  0.93737972]
123456
[ 0.38034135  0.92277589  0.71719341  0.56506722  0.93737972]
654321
'''
### Python基础编程中回文字符串的实现方法 在Python基础编程中,处理回文字符串是一个常见的问题。以下是几种实现方法以及相关代码示例。 #### 方法一:暴力枚举法 暴力枚举法通过遍历所有可能的子串并逐一判断是否为回文来解决问题。这种方法虽然简单易懂,但时间复杂度较高,最坏情况下可达 \(O(N^3)\)[^4]。 ```python def is_palindrome(s): return s == s[::-1] def longest_palindrome_brute_force(s): max_len = 0 result = "" for i in range(len(s)): for j in range(i, len(s)): substr = s[i:j+1] if is_palindrome(substr) and len(substr) > max_len: max_len = len(substr) result = substr return result ``` #### 方法二:动态规划法 动态规划法利用状态转移方程 \(P(i, j) = P(i+1, j-1) \&\& (S_i == S_j)\) 来优化回文检测过程[^3]。这种方法的时间复杂度为 \(O(N^2)\),空间复杂度同样为 \(O(N^2)\)。 ```python def longest_palindrome_dp(s): n = len(s) if n == 0: return "" dp = [[False]*n for _ in range(n)] start, max_len = 0, 1 for j in range(n): for i in range(j+1): if s[i] == s[j] and (j - i < 2 or dp[i+1][j-1]): dp[i][j] = True if j - i + 1 > max_len: start = i max_len = j - i + 1 return s[start:start+max_len] ``` #### 方法三:中心扩展法 中心扩展法通过枚举每个可能的回文中心,并向两边扩展以找到最长回文子串。这种方法的时间复杂度为 \(O(N^2)\),但实际运行效率通常优于动态规划法[^4]。 ```python def expand_around_center(s, left, right): while left >= 0 and right < len(s) and s[left] == s[right]: left -= 1 right += 1 return s[left+1:right] def longest_palindrome_expand(s): if not s: return "" res = "" for i in range(len(s)): # 奇数长度回文 odd = expand_around_center(s, i, i) if len(odd) > len(res): res = odd # 偶数长度回文 even = expand_around_center(s, i, i+1) if len(even) > len(res): res = even return res ``` #### 方法四:Manacher算法 Manacher算法是一种高效的回文检测算法,时间复杂度为 \(O(N)\)。该算法通过对原字符串进行预处理,使得可以统一处理奇偶长度的回文[^4]。 ```python def longest_palindrome_manacher(s): if not s: return "" t = '#'.join('^{}$'.format(s)) n = len(t) p = [0] * n center = right = 0 for i in range(1, n-1): if right > i: p[i] = min(right - i, p[2*center - i]) while t[i + 1 + p[i]] == t[i - 1 - p[i]]: p[i] += 1 if i + p[i] > right: center, right = i, i + p[i] max_len, center_index = max((n, i) for i, n in enumerate(p)) return s[(center_index - max_len)//2:(center_index + max_len)//2] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值