复试算法练习Day11——字符串中单词逆序输出

复试算法练习Day11

题目描述

将一个英文语句以单词为单位逆序排放。例如“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中自带函数需要自己多考虑输出情况。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值