蓝桥杯备赛-基础训练(四)字符串 day17
好久不见,今天开始继续更新,或许拿不了奖,但是希望记录自己学习的过程,如果感觉有收获的同学在下面多多评论说说我代码的缺陷,感谢大家!
1、反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:
输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
思路|+代码:
这个题在python中可以用很简单的切片的方法来操作,只需要简单的几行代码就可以:
# 翻转字符串
s1 = str(input("请你输入你想要翻转的字符串:"))
print(s1)
s1 = s1[::-1]
print(s1)
其实这个操作很简单,主要就是头和尾进行交换,如果大家希望使用列表同时使用指针的话也是可以的,使用两个指针是比较好的情况:
s1 = list(str(input("请你输入你想要翻转的字符串:")))i = 0
j = len(s1)-1
print(j)
while i<=j:temp = s1[i]s1[i] = s1[j]s1[j] = tempi+=1j-=1
print(s1)
2、反转字符串II
给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
思路:
判断剩余的总字数-有三种情况
每一种情况是不是可以对应不同的处理方式?
每一种处理方式其实可以写成一种固定的函数之类的
后来根据“代码随想录”上的思路,其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
我们可以这样理解这个题目,
第一种标准是:如果满足2*k个数字的要求,就是翻转2*k个数字的前k个(翻转这前k个可以写一个专门的函数进行翻转,与上述反转字符串是一样的)
第二种标准是:如果剩下的字符数是大于k但是小于2*k的,那么我们就翻转这k个字符,其他字符就保持原样了(在这里有一点点歧义,我原来想的是,如果大于k小于2*的话,那经过这一轮的k个字符翻转以后,剩下的不就是<k了,我以为还需要再反转,但是我感觉题目的意思并不是这样的,后来看了卡哥的代码发现应该确实不是这样的)
第三种标准是:如果剩下的字符数是小于k的,那就是直接翻转
其实这个代码还是比较简单的,上述的三种情况梳理过后,其实直接调用写好的翻转函数就可以了
代码:
# 翻转字符串-2
from typing import Listdef reverse(s:List[str],i:int,j:int)->None:while i<=j:s[i],s[j] = s[j],s[i]i+=1j-=1s = list(str(input("请你输入你想要翻转的字符串:")))
print(s)
k = int(input("请你输入你希望的k值:"))
l = len(s)
i = 0
while i<=(l-1):if i+k < l:reverse(s,i,i+k-1)else:reverse(s,i,l-1)i += 2 * k
print(s)