代码训练营 Day 8 | 字符串part01

文章介绍了如何在Python中实现字符串反转,包括基础的逐字符反转方法,以及更高效的解决方案,如ReverseStringII中的区间反转策略。同时提及了Python处理字符串的不同之处和双指针算法的应用。
摘要由CSDN通过智能技术生成

最近开学作业太忙了,现在先慢慢补前几天的题目打卡

今天第一题

344. Reverse String

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

今日第二题

541. Reverse String II

没有什么好的思路,看看答案:

一些同学可能为了处理逻辑:每隔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
 

还没写出来,暂定明天写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值