最近开学作业太忙了,现在先慢慢补前几天的题目打卡
今天第一题
Write a function that reverses a string. The input string is given as an array of characters s
.
You must do this by modifying the input array in-place with O(1)
extra memory.
Example 1:
Input: s = ["h","e","l","l","o"] Output: ["o","l","l","e","h"]
Example 2:
Input: s = ["H","a","n","n","a","h"] Output: ["h","a","n","n","a","H"]
##反转字符串
## 最先想到的解法是设置一个数组然后获取ASC码值然后再反转字符串
## ord()
## ⚠️原地修改数组
s = ["h","e","l","l","o"]
s = ["h","e","l","l"]
n = int(len(s)/2) ##中点
l = len(s)-1 ##最长长度
##不用手动判断奇偶其实
#even number
if len(s)%2==0:
for i in range(int(len(s)/2)): ##i是起始位置
temp = s[i]
s[i] = s[l]
s[l] = temp
l -= 1
#odd number
else:
for i in range(int(len(s)/2)): ##i是起始位置
temp = s[i]
s[i] = s[l]
s[l] = temp
l -= 1
print(s)
len(s)//2 ##//可以向下取整,不用手动int
今日第二题
没有什么好的思路,看看答案:
一些同学可能为了处理逻辑:每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。
其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
因为要找的也就是每2 * k 区间的起点,这样写,程序会高效很多。
## 注意点⚠️ if (i+k<s.size) 保证这个字符串不要超过数组的长度 这里是〈还是《,带例子进去(是《
s = "abcdefg"
k=2
## 先把反转字符串1写一个封装
def reverse_string(s):
n = len(s) // 2 # 中点
l = len(s) - 1 # 最长长度
for i in range(n): # i是起始位置
temp = s[i]
s[i] = s[l]
s[l] = temp
l -= 1
return s
char_array = list(s)
for i in range(0,len(char_array),2*k):
start = i
## 1. 每隔 2k 个字符的前 k 个字符进行反转
## 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
if i+k <= len(char_array):
s_new = char_array[i:i+k-1]
reverse_string(s_new)
continue
s_new2 = char_array[i:len(char_array)-1]
print(s)
## 写的反转函数有问题
自己写的有点问题,还是不看了,去看别人的参考答案
## 解法二还可以用temp来交换数值,会的人更多些
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i = 0;i < ch.length;i += 2 * k){
int start = i;
// 判断尾数够不够k个来取决end指针的位置
int end = Math.min(ch.length - 1,start + k - 1);
while(start < end){
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
start++;
end--;
}
}
return new String(ch);
}
}
今天第三题
剑指 Offer 05 . 替换空格 LCOF
做到极致是可以把空间复杂度缩小的,但是我目前只求通过zz
sn = []
for char in s:
if char == ' ':
print("kongge")
sn.append('%20')
else:
sn.append(char)
print(sn)
## 但是这个时候的sn还是分隔的char类型,没有变成字符串
''.join(sn) # 使用这个方法来变成字符串
今天第四题
151. Reverse Words in a String
## python和其他语言的算法不太一样, python比较简洁,先学会python
## 双指针答案:
s = "the sky is blue"
words = s.split()
type(words) ##list??类型
left,right = 0, len(words)-1
print(words[left])
print(words[right])
while left < right:
words[left], words[right] = words[right], words[left]
left += 1
right -= 1
## 最后还要合并一下成为stirng 用join函数
今天第五题
剑指 Offer 58 - II . 左旋转字符串 LCOF
还没写出来,暂定明天写