题解 | #单词倒排#

单词倒排

https://www.nowcoder.com/practice/81544a4989df4109b33c2d65037c5836

解题思路

  1. 首先将输入字符串中的非字母字符替换为空格
  2. 按空格分割字符串得到单词数组
  3. 反转单词数组
  4. 用空格连接单词数组输出结果

代码

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

int main() {
    string s;
    getline(cin, s);
    
    // 将非字母字符替换为空格
    for(char& c : s) {
        if(!isalpha(c)) {
            c = ' ';
        }
    }
    
    // 分割单词
    vector<string> words;
    string word;
    for(int i = 0; i < s.length(); i++) {
        if(s[i] != ' ') {
            word += s[i];
        } else if(!word.empty()) {
            words.push_back(word);
            word = "";
        }
    }
    if(!word.empty()) {
        words.push_back(word);
    }
    
    // 反转单词顺序
    reverse(words.begin(), words.end());
    
    // 输出结果
    for(int i = 0; i < words.size(); i++) {
        cout << words[i];
        if(i != words.size() - 1) {
            cout << " ";
        }
    }
    
    return 0;
}
def word_reverse():
    # 读取输入
    s = input()
    
    # 将非字母字符替换为空格
    s = ''.join(' ' if not c.isalpha() else c for c in s)
    
    # 分割并反转单词
    words = s.split()
    words.reverse()
    
    # 输出结果
    print(' '.join(words))

if __name__ == "__main__":
    word_reverse()
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        
        // 将非字母字符替换为空格
        s = s.replaceAll("[^a-zA-Z]", " ");
        
        // 分割单词并反转
        String[] words = s.trim().split("\\s+");
        StringBuilder result = new StringBuilder();
        
        // 倒序拼接单词
        for(int i = words.length - 1; i >= 0; i--) {
            result.append(words[i]);
            if(i > 0) {
                result.append(" ");
            }
        }
        
        System.out.println(result.toString());
    }
}

算法及复杂度

  • 算法:字符串处理 + 数组反转
  • 时间复杂度:,其中 n 为输入字符串长度
  • 空间复杂度:,需要存储分割后的单词数组
全部评论

相关推荐

面试官全程关摄像头1.自我介绍一下2.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗&nbsp;&nbsp;他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了&nbsp;&nbsp;好好准备,等待明天的影石360和周四的腾讯了&nbsp;&nbsp;加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务