您的位置:首页 > 编程语言 > Go语言

JD_题目1525:子串逆序打印(2012年Google校园招聘笔试题目)

2015-05-07 17:16 375 查看
题目1525:子串逆序打印

时间限制:1 秒

内存限制:128 兆

特殊判题:

提交:2629

解决:431

题目描述:
小明手中有很多字符串卡片,每个字符串中都包含有多个连续的空格,而且这些卡片在印刷的过程中将字符串的每个子串都打印反了,现在麻烦你帮小明将这些字符串中的子串修正过来,同时为了使卡片美观,压缩其中的连续空格为1个。

输入:
输入包含多个测试用例,每个测试用例的第一行是一个正整数 n,1=<n<=100000,代表卡片上字符串的长度。第二行输入长度为n的字符串(字符串仅包含小写字母和空格)。当n为0时,代表输入结束。

输出:
对应每个测试用例,请按照要求输出修正过的字符串。

样例输入:
3
abc
13
abc   efg hij

样例输出:
cba
cba gfe jih

来源:2012年Google校园招聘笔试题目 这道题我的思路是,从前往后,循环一遍,因为要考虑在字符串前面和后面有空格的情况,还有全是空格的情况,所以在开始时,我先将这两种情况判断下看有没,将str_start,str_end定位到前面真正开始的时候和后面真正结束的时候,,然后依次在这两个范围内循环,当遇到空格而前面不为空格是,从这点往后循环的压到另外一个string中(这里设置标志flag来判断)最后不晓得为啥在那个九度上没有AC,见鬼了

#include<iostream>
#include <string>
#include <stack>
#include <vector>
using namespace std;

string reverse_string(string& str)
{
string last;//最终的结果
int str_len=str.size();//字符数组长度
int str_start=0;//开始位置
int str_end=str_len-1;//终止位置
int flag=0;//作为标志

int low=0;
int high;

if(str[0]==' ')
{
int F_flag=0;
for(int i=0;i<str_len;i++)
if(str[i]!=' ')
{
F_flag=1;
str_start=i;
low=str_start;
last.push_back(' ');
break;
}
if(F_flag==0)
{
last.push_back(' ');
return last;
}
}

if(str[str_len-1]==' ')
{
for(int i=str_len-1;i>=0;i--)
if(str[i]!=' ')
{
str_end=i;
break;
}
}

for(int i=str_start;i<=str_end;i++)
{
if(i==str_end)
{
high=i;
for(int j=high;j>=low;j--)
last.push_back(str[j]);
break;
}

if(str[i]==' ')
{
if(flag==0)
{
high=i-1;
for(int j=high;j>=low;j--)
last.push_back(str[j]);
last.push_back(' ');
flag=1;
low=i+1;
}
else
low++;
}
else
flag=0;
}
if(str_end<str_len-1)
last.push_back(' ');
return last;
}

int main()
{

int n;
string str;

while(cin>>n)
{
cin.sync();
if(n==0)
return 1;
getline(cin,str);
cout<<reverse_string(str)<<endl;
}

/*string str=" ab cd ";
string str="   abfs usg fggg   ";
string str1=reverse_string(str);
cout<<str<<endl;
cout<<str1<<endl;*/
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: