python算法编程题
一、最长不含重复字符的子字符串问题
给定一个字符串,要求出其中不含有重复字符的最长子字符串,并返回子字符串的长度。
解法一:暴力解法
对于每一个字符,都以该字符为起始向后遍历,判断是否出现重复字符,记录最长的子字符串长度。
```python
def longest_substring_without_repeat(s):
max_len = 0
for i in range(len(s)):
seen = set
length = 0
for j in range(i, len(s)):
if s[j] in seen:
break
else:
seen.add(s[j])
length += 1
max_len = max(max_len, length)
return max_len
```
该解法的时间复杂度为O(n^2),其中n为字符串的长度。
解法二:滑动窗口
使用两个指针start和end表示子字符串的起始和结束位置。当end指针遍历到一些字符时,如果该字符在子字符串中出现过,则将start指针移到上次该字符出现的位置的后一个位置;否则,将该字符加入子字符串,更新最长子字符串的长度。
```python
def longest_substring_without_repeat(s):
max_len = 0
start = 0
end = 0
seen = set
while end < len(s):
if s[end] in seen:
ve(s[start])
start += 1
else:
seen.add(s[end])
max_len = max(max_len, end - start + 1)
end += 1
return max_len
```
该解法的时间复杂度为O(n),其中n为字符串的长度。
二、出数组中和为给定值的两个数的下标
给定一个整数数组nums和一个目标值target,要求到数组中两个数的下标,使得这两个数之和等于target,并返回这两个数的下标。
解法一:暴力解法
对于nums中的每一个数,遍历其后的数,判断是否存在两个数之和等于target。若存在,则返回两个数的下标。
```python
def two_sum(nums, target):
for i in range(len(nums)-1):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
```
该解法的时间复杂度为O(n^2),其中n为数组的长度。
解法二:使用哈希表字符串长度怎么判断
遍历数组nums,对于每一个数,判断其与target之差是否出现过。若出现过,则返回差值对应的下标和当前数的下标。
```python
def two_sum(nums, target):
hashmap = {}
for i in range(len(nums)):
hashmap[nums[i]] = i
```
该解法的时间复杂度为O(n),其中n为数组的长度。
三、判断一个数是否为回文数
给定一个整数x,要求判断x是否是回文数,即从左向右和从右向左读都是一样的。
解法一:转换为字符串
将整数x转换为字符串,然后判断该字符串是否为回文字符串。
```python
def is_palindrome(x):
s = str(x)
return s == s[::-1]
```
该解法的时间复杂度为O(n),其中n为字符串的长度。
解法二:反转数字
将整数x反转后,判断反转后的数是否和原始数相等。
```python
def is_palindrome(x):
if x < 0 or (x % 10 == 0 and x != 0):
return False
reverse = 0
while x > reverse:
reverse = reverse * 10 + x % 10
x//=10
return x == reverse or x == reverse // 10
```
该解法的时间复杂度为O(logn),其中n为x的大小。
以上是三道较为常见的算法编程题。这些题目都可以通过暴力解法或者优化解法来解决,而优化解法往往能够提高程序的效率。在实际的编程过程中,需要根据具体的情况选择合适的解法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论