7韩韩糊糊7 2025-12-25 15:56 采纳率: 0%
浏览 6

从键盘输入一个字符串,包含很多个单词。每个单词之间以1个或多个空格隔开。要求翻转每个单词,但是单词在句子中的顺序不变。注意行前和行后可能有多个空格。

img

img


上台阶(CIE-C3-202212-4)
这里有一道问题,需要求解答,谢谢

  • 写回答

1条回答 默认 最新

  • 关注

    1. 上台阶题(CIE-C3-202212-4)

    核心特简单:一次能走1/2/3阶,所以n阶的走法数 = 走n-1阶 + n-2阶 + n-3阶。先把前3阶的数定死(1阶1种、2阶2种、3阶4种),后面套公式算就行。

    #include <iostream>
    using namespace std;
    
    int main() {
        int dp[51] = {0,1,2,4}; // dp[阶数]=走法数,直接初始化前3阶
        for (int i=4; i<=50; i++) dp[i] = dp[i-1]+dp[i-2]+dp[i-3];
        int n;
        while (cin>>n && n) cout << dp[n] << endl; // 输入0就结束
        return 0;
    }
    

    2. 翻转单词题

    关键就一点:只翻单词本身,不管首尾/中间有多少空格,都原样保留。思路就是遍历字符串,遇到空格直接抄,遇到单词先抠出来翻转再拼回去。

    #include <iostream>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    int main() {
        string s, res;
        getline(cin, s); // 读整行(包含所有空格)
        for (int i=0; i<s.size(); ) {
            if (s[i] == ' ') { // 处理连续空格
                int j=i;
                while (j<s.size() && s[j]==' ') j++;
                res += s.substr(i, j-i);
                i=j;
            } else { // 翻转单词
                int j=i;
                while (j<s.size() && s[j]!=' ') j++;
                string word = s.substr(i, j-i);
                reverse(word.begin(), word.end());
                res += word;
                i=j;
            }
        }
        cout << res << endl;
        return 0;
    }
    

    总结

    1. 上台阶:用dp数组存走法数,核心公式dp[i] = dp[i-1]+dp[i-2]+dp[i-3]
    2. 翻转单词:区分空格段和单词段,只翻转单词,空格结构不变。
    评论

报告相同问题?

问题事件

  • 创建了问题 12月25日