算法练习Day04
题目描述
接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)
题目来源
(https://www.nowcoder.com/practice/e45e078701ab4e4cb49393ae30f1bb04?tpId=37&tqId=21235&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D37%26type%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=)
输入描述
输入一行,为一个只包含小写字母的字符串。
输出描述
输入一行,为一个只包含小写字母的字符串。
输入:
abcd
输出:
dcba
思路
为了实现字符串反转,首先利用通过scanf把字符串直接存储到数组中。
为了解决字符串反转问题,将数组的首尾利用两个字符串分别指向后,把两个指针所在的字符交换即可。
每次指针strLeft和strRight所指向的位置所在字符交换之后,strLeft++,strRight–,这样可以继续交换下一对字符,当strLeft>=strRight的时候,退出循环结束交换,判断条件利用while循环设置为(strLeft<strRight)即可。
具体实现
//字符串反转
#include<stdio.h>
int main(){
//str输入数组初始化
char* str[1000]={};
//输入初始数组元素
scanf("%s",str);
//求出字符串长度
int length = strlen(arr);
//设置数组首尾对应指针
char* strleft = str;
char* strright= str;
//让right指向数组末尾
strright += length-1;
//如果头指针小于尾部指针则跳出循环
//遍历结束
while(strleft<strright){
//设置临时变量交换前后指针对应字符
char tmper = *left;
*strleft = *strright;
*strright = tmper;
strleft++;
strright--;
}
printf("%s",str);
return 0;
}
##利用Python可以用三种方法实现字符串反转
#第一种直接使用Python自带的字符串切片,直接反转
result = s[::-1]
#时间复杂度O(1)
#第二种可以采用reverse列表函数的方法
#初始化一个列表
l = list(s)
#将其反转,逆序输出即可
l.reverse()
result = "".join(l)
#时间复杂度O(1)
#第三种利用递归函数
#定义一个递归函数,如果字符串只有一个元素直接输出
#如果字符串有多个字符则将字符串切片每次对应反转并与之前字符串相加
#累计所有数据输出结束即得到最终结果
def func(s):
if len(s) <1:
return s
return func(s[1:])+s[0]
result = func(s)
#时间复杂度O(1)
时间复杂度
由于是分别遍历两个数组一个从头开始一个从尾部开始每次只比较一个
所以时间复杂度为O(n)
采用两个数组空间复杂度为O(n)
小结
在用c写的时候要考虑遍历数组的时候需要知道数组长度,方便设置首尾指针,利用Python写的时候由于可以直接把字符串分片,所以可以直接出结果,或者采用递归函数依次分片后累计加和,或者初始化一个list列表之后,采用reverse函数之间反转列表后输出即可。由于Python的简洁性可以利用很少的代码快速完成所需要解决的问题,但是在理解工作原理上还是c更好理解,方便构建清晰地代码逻辑,有利于算法编写能力的提升。