HWOJ 字符串的排序

来源:互联网 发布:lol免费改名软件 编辑:程序博客网 时间:2024/05/09 10:12

HWOJ 字符串的排序

题目:字符串的排序
题目描述:

Alt text

题目分析:
①因为题目不分大小写,所以我们考虑用#include<cytpe.h>的toupper来转化成大写字母
注意tolower是把大写转化为小写
②之后非英文字母的不变,所以我们要有一个循环,当!isalpha时,直接循环加1,这里特别需要注意如果循环加1之后必须要小于len哦
③关键在于第二点比较难,因为我们常规思路,外循环为i,0-len-1 内循环为j:i+1 - len-1
这样我们发现不对。
举例说明:
BabA -> aBbA -> aBbA -> aAbB 这样我们可以知道bB位置不对
所以我们该怎么考虑呢?
例如我们每下就比较初位置和后一位的位置呢?
例如:
BabA -> aBbA -> aBbA -> aBAb ->再次循环 ->aBAb -> aABb这样就满足条件了
由上述分析,我们可以知道
我们其实需要一个最外循环i,还需要一个内循环j,还需要一个k=j+1 去比较,那么我们就要思考i与j的关系呢?实际上,就是再次循环一次,但是我们不能由把j定义和i一样,否则就不是双循环了,这里我们可以知道j = len - 1 - i刚好可以全部倒过来循环一次。

========================================================================
参考代码:

//字符排序.cpp//2014.7.8#include <iostream>#include <string>#include <ctype.h>using namespace std;string sort_string(string str){    char temp;    int i,j,k = 0;    for(i = 0; i < str.size(); i++)    {        for(j = 0; j < str.size() - 1 - i; j++)        {                k = j + 1;            while(k < str.size() && !isalpha(str[k]))                k++;            if(k < str.size() && toupper(str[j]) > toupper(str[k]))            {                temp = str[j];                str[j] = str[k];                str[k] = temp;            }        }    }    return str;}int main(){    string s;    getline(cin,s);    cout <<  sort_string(s) << endl;    return 0;}

调试犯错误地方:
①注意区分头文件#include<ctype.h>和#include<string> c++中string不用加h,但是ctype必须要加上.h
②C++string中带空格输入的字符串我们不能写成getline(s),我们要写成getline(cin,s)
③注意要区分子函数中int char string 和void 如果没有返回值,我们可以用void,但是到主函数的时候,我们直接把sort_string(string str);cout << s << endl;
或者像上面代码这样来写,切记别乱用。
④这里特别要注意k < str.size(),否则我们就会报错。
⑤当字符串题目中不分大小写时,我们常常采用toupper或者tolower转化,记得加上头文件#include<ctype.h>
⑥记住这里需要注意一个越界问题,
我们需要都加上k<str.size(),而且写在前面,以后我们防止越界问题时候,我们写这个应该写在&&前面。


0 0
原创粉丝点击