H面试程序(4):翻转句子中单词的顺序 .
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。
#include<stdio.h>
#include<assert.h>
//45min
void swap(char *a, char *b)
{
assert(a);
assert(b);
char temp;
temp = *a;
*a = *b;
*b = temp;
} void reverse(char * str,int start,int end)
{
assert(str); int j = (end-start)/2; for(int i =0; i<=j; i++)
swap(&(str[start++]), &(str[end--]));
} void ReverceSentence(char * Str)
{
assert(Str);
int i = 0;
while(Str[i] !='\0')
{
i++;
}
int strlen = i; //得到字符串的长度 //整个字符串进行翻转
reverse(Str,0,strlen-1); //每个单词进行翻转 int j ;
for(j = 0; j < strlen-1; j++) //最后一个那个'\0'不用管它
{
int start = j;//每个单词的起始位置
int end = j; //每个单词介绍的位置,初始化为j(新单词起始的位置)
while(Str[j] != ' '&&Str[j] != '\0' ) //遇到空格或结束符的时候退出,否则继续判断
{
end++;
j++;
}
reverse(Str,start, end-1); //对单个字符进行翻转
}
} int main()
{
char sentence[]="I am a student!";
ReverceSentence(sentence);
printf("%s",sentence);
printf("\n");
return 0;
}
网上参考答案
#include <iostream>
using namespace std; void Reverse(char *start,char *end) //翻转字符串
{
if(start==NULL||end==NULL)
return; char temp;
while(start<end)
{
temp=*start;
*start=*end;
*end=temp;
start++;
end--;
}
} char *ReverceSentence(char *pstr)
{
if(pstr==NULL)
return NULL; //先将整个句子翻转
char *start=pstr;
char *end=pstr+strlen(pstr)-1;
Reverse(start,end); start=pstr;
end=pstr; //取出一个个单词,翻转之
while(*start!='\0')
{
if(*start==' ') //单词起始至非空格字符
{
start++;
end++;
continue;
}
else if(*end==' '||*end=='\0') //结束至空格或结束符前一个字符
{
Reverse(start,--end);
start=++end;
}
else
end++;
}
return pstr;
}
int main()
{
char sentence[]="I am a student!";
char *reverced=ReverceSentence(sentence);
cout<<reverced<<endl;
system("pause");
return 0;
}
/*把给定的字符串的begin到end之间的部分翻转*/
void _reverse(char *str, int begin, int end)
{
int i = 0;
while(i <= (end - begin) / 2)
{
swap(str[begin + i], str[end - i]);
++i;
}
}
H面试程序(4):翻转句子中单词的顺序 .的更多相关文章
- 翻转句子中单词的顺序 C语言
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.句子中单词以空格符隔开. 为简单起见,标点符号和普通字母一样处理. 比如将"I am a student"转化为&q ...
- 7.翻转句子中单词的顺序[ReverseWordOrderInSentence]
[题目] 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.句子中单词以空格符隔开.为简单起见,标点符号和普通字母一样处理. 例如输入“I am a student.”,则输出“stud ...
- IT公司100题-10-翻转句子中单词的顺序
问题描述: 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变. 句子中单词以空格符隔开.为简单起见,标点符号和普通字母一样处理. 例如输入“Hello world!”,则输出“world ...
- 【c++】计算句子中单词的平均长度
Description 编程输入一行文本,计算这行文本的单词平均长度.假设每个单词用至少一个空格或者标点(英文逗号.句号)隔开.使用C++ string类型. Input 输入一行文本,不包含数字 O ...
- OpenJudge计算概论-单词倒排【把句子内单词的顺序翻转】
/*================================================== 单词倒排 总时间限制: 1000ms 内存限制: 65536kB 描述 编写程序,读入一段英文 ...
- H面试程序(12): 输出字符串中第一个只出现一次的字母
题目描述: 若字符串str为'' sbdddsbfc'',则输出 f; 若字符串str为''aabbccdd'',则输出:字符串str中的字符都出现两次以上 #include <stdio.h& ...
- 557. Reverse Words in a String III 翻转句子中的每一个单词
[抄题]: Given a string, you need to reverse the order of characters in each word within a sentence whi ...
- H面试程序(28):字符串处理转换
//2 字符串处理转换 //问题描述: //在给定字符串中找出单词( “单词”由大写字母和小写字母字符构成, //其他非字母字符视为单词的间隔,如空格.问号.数字等等:另外单个字母不算单词): //找 ...
- (C#) 反转字符串,反转一个句子中单词。
这个是非常基本的一道面试题,但是要考虑周全. 首先反转一个字符串: 基本思路是变成Char数组,然后调用C#里面的方法,或者设定两个index,从头,尾向中间遍历,并交换. 方法一: Array.Re ...
随机推荐
- [LeetCode] Decode Ways [33]
题目 A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A ...
- 采用sharedPreference保存数据
1.sharedPreference保存数据 package com.example.login.service; import java.io.BufferedReader; import java ...
- ASP.NET aspx页面中 写C#脚本; ASP.NET 指令(<%@%>);
1 <h2>Welcome</h2> <ul> <% for (int i = 0; i <= Convert.ToInt32(ViewData[&qu ...
- C++赋值运算符与赋值表达式
赋值运算符 赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量.如“a=3”的作用是执行一次赋值操作(或称赋值运算).把常量3赋给变量a.也可以将一个表达式的值赋给一个变量. 赋值过程中的 ...
- hibernate 一对多映射
package com.entity.onetomany; import java.util.ArrayList; import java.util.List; import javax.persis ...
- 浅尝key-value数据库(一)——一览NoSQL
浅尝key-value数据库(一)——一览NoSQL 最近由于一个项目的关系,研究了一下key-value数据库这个最近很火的概念.本系列从项目需求的角度分析并测试了几个key-value数据库的性能 ...
- 基于visual Studio2013解决算法导论之011快排改良
题目 快排改良 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #in ...
- SQL之概念
SQL即结构化查询语言,是一个功能强大的数据库语言,可以分为: 1.DML即数据操作语言,用于检索或者修改数据: 2.DDL即数据定义语言,用于定义数据的结构,如创建.修改.删除等: 3.DCL即数据 ...
- log翻硬币
若果有一组硬币,(假定有十个),每一个硬币仅仅有两个面,正面用以表示.反面用零表示. 给定目标(初始状态)1111100000 正正正正正反反反反反 (目标状态) 1000011101 正反反反反 ...
- 【linux kernel】 softirq 软中断讨论
欢迎转载,转载时需保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...