字符串句子排序问题

目录

一·题目概述:

二·思路分析:

第一步:

第二步:

第三步:

第四步:

三·解答代码:


一·题目概述:

leetcode题目链接1859. 将句子排序 - 力扣(LeetCode) 

二·思路分析:

当拿到这这道题,其实一下子就会知道此题要输出的是什么,就是按照数字字符的顺序去把单词给还原出来。

而题目要求的输入为什么数字字符要安排在原单词后面呢,于是就想到了它如果是按照倒序遍历,再给它复原确实也挺好的。

故下面 以例1为例子说一下我的思路:

第一步:

就是先得到数字字符的个数,这个可以根据空格+1来完成,因此用count把它记录下来。

第二步:

把原字符串完全倒置过来(也就是利用算法库的reverse):

第三步:

根据数字字符范围,利用find找到此处的迭代器,并利用一定范围把字符添加到临时string tmp 中(这里是倒序的)

 

第四步:

最后面也就是颠倒过来然后补空格,但是最后要返回的ss之后末尾会多一个空格,然后给它去掉即可。 

 注:可能完成代码的途中,会在迭代器遍历这里出现问题:

如没控制好范围导致的迭代器越界访问:

如果没有if 和else 而是直接it=it+1;

这样就会发生迭代器越界访问(没有if):

但是只有上面判断也可能会导致死循环(没有else):

 

其他就思路走没有什么特别注意的地方了。 

 

三·解答代码:

class Solution {
public:

    string sortSentence(string s) {
        int count = 1;
        string ss;
        string tmp;
        for (int i = 0; i < s.size(); i++) {
            if (isspace(s[i])) {
                count++;//找到数字个数
            }
        }
        reverse(s.begin(), s.end());
        for (int j = 1; j <= count; j++) {
            string::iterator t_it = find(s.begin(), s.end(), j+'0');
            string::iterator it = t_it+1;//确定对应单词开头位置
            while (!isspace(*it) && !isdigit(*it) && (*it) != '\0') {//判断终止条件
                tmp += *it;
                if (it != s.end() - 1) it = it + 1;//防止迭代器循环或者越界访问,(当遍历到最后的时候)
                else break;
            }
            //完成到ss中添加:
            reverse(tmp.begin(), tmp.end());
            tmp += ' ';
            ss += tmp;
            tmp.clear();



        }
        ss.pop_back();//去掉最后一个空格
        return ss;
    }

};

 

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值