复试算法练习Day11
文章目录
- 复试算法练习Day11
- 题目描述
- 输入描述
- 输出描述
- 示例1
- 示例2
- 思路
- 具体实现
- 时间复杂度
- 小结
题目描述
将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符
数据范围:输入的字符串长度满足 1 \le n \le 1000 \1≤n≤1000
注意本题有多组输入
输入描述
输入一个英文语句,每个单词用空格隔开。保证输入只包含空格和字母。
输出描述
得到逆序的句子
示例1
输入:
I am a boy
输出:
boy a am I
示例2
输入:
nowcoder
输出:
nowcoder
思路
设置两个数组指针,第一个指向原字符串,第二个指向反向输出的Word字符串,第一个指针扫描原字符串,遇见空格则继续往前扫描,扫到一个单词结束之后将其加入Word字符串中,依次扫描直到扫描完所有的单词,扫描一个单词把得到的结果放入其中,最后给出整体的输出结果。
具体实现
//字符串中单词逆序输出
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
//建立逆转单词函数IWord()
//设置指针p和字符串长度长度len
void IWord(char *p,int len){
//字符串初始化
int word = 0;
char *h = p;
p = p + len-1;
//遍历单词的个数
while (p-h>=0){
if (*p!=' '&&p!=h){
word++;
}
//如果扫描到字符串为空则遍历字符串把单词加入word数组
else if(*p==' '){
for (int i = 1; i <= word;++i){
printf("%c",*(p+i));
}
printf(" ");
word = 0;
}
//如果遍历指针和Word数组指针相同则输出结果
else if (p==h){
for (int i = 0; i <= word; ++i){
printf("%c", *(p + i));
}
printf("\n");
}
p--;
}
}
int main(){
//初始化字符串数组
char arr[50000];
gets(arr);
int len = strlen(arr);
//测试函数结果
IWord(arr,len);
return 0;
}
##利用Python实现一个英文语句以单词为单位逆序排放
#可以采用Python中自带的reverse()函数来进行数组的逆转,
#但是reverse()无法对字符串直接进行操作,
#所以输入字符串以空格为单位分割,
#转为列表后采用reverse函数将其看成一个整体
list_number = list(input().split(' '))
#再将以" "为单位对列表中的单词进行组合为字符串
#通过对于字符串的反向输出即可得到结果
list_number.reverse()
print(" ".join(list_number))
时间复杂度
由于是顺序遍历的结果,所以一次遍历后在比较单词后加入新字符串中,因此时间复杂度维O(n),如果利用Python中得reverse函数,则时间复杂度为O(1)
小结
在C语言中采用了两个指针分别遍历字符串数组,遇见空格即将单词加入新的逆转单词数组中,再利用Python中得reverse函数来逆序输出字符的时候,利用单词的空格将其字符串以空格分割之后组合成一个列表,让reverse函数对于列表逆转即可得到输出,利用Python中自带函数需要自己多考虑输出情况。