news 2026/4/30 11:36:47

华为OD机试双机位C卷 - 去除多余空格 (C++ Python JAVA JS GO)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机试双机位C卷 - 去除多余空格 (C++ Python JAVA JS GO)

去除多余空格

2025华为OD机试双机位B卷 - 华为OD上机考试双机位B卷 200分题型

华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解

题目描述

去除文本多余空格,但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标,去除多余空格后刷新关键词的起始和结束下标。

条件约束:

  1. 不考虑关键词起始和结束位置为空格的场景;
  2. 单词的的开始和结束下标保证涵盖一个完整的单词,即一个坐标对开始和结束下标之间不会有多余的空格;
  3. 如果有单引号,则用例保证单引号成对出现;
  4. 关键词可能会重复;
  5. 文本字符长度length取值范围:[0, 100000];

输入描述

输入为两行字符串:

第一行:待去除多余空格的文本,用例保证如果有单引号,则单引号成对出现,且单引号可能有多对。

第二行:关键词的开始和结束坐标,关键词间以逗号区分,关键词内的开始和结束位置以单空格区分。

输出描述

输出为两行字符串:

第一行:去除多余空格后的文本
第二行:去除多余空格后的关键词的坐标开始和结束位置,为数组方式输出。

用例1

输入

Life is painting a picture, not doing 'a sum'. 8 15,20 26,43 45

输出

Life is painting a picture, not doing 'a sum'. [8, 15][19, 25][42, 44]

说明

a和picture中间多余的空格进行删除

用例2

输入

Life is painting a picture, not doing 'a sum'. 8 15,19 25,42 44

输出

Life is painting a picture, not doing 'a sum'. [8, 15][19, 25][42, 44]

说明

a和sum之间有多余的空格,但是因为有成对单引号,不去除多余空格

题解

思路:模拟

  1. 解析输入,将输入的关键词坐标按,分割,每个坐标对再按空格分割得到[start, end]
  2. 去除多余空格:定义res存储结果字符串,isInQuote表示是否在单引号中,deletePos数组存储删除空格坐标,去除空格逻辑如下:
    1. 如果当前字符和前一个字符都是空格,且不在引号内,则标记删除该空格(记录其索引)。不拼接到结果字符串中,其它情况都拼接
    2. 单引号出现时切换isInQuote状态
  3. 维护坐标偏移:线性扫描+负前缀和,
    1. 创建长度为text.length()的数组shift,初始化为 0。
    2. 遍历被删除的空格索引deletePos,将对应位置shift[pos] -= 1
    3. 累加前缀和:shift[i] += shift[i-1],表示删除空格后每个位置的总偏移量。
  4. 输出结果字符串res
  5. 输出偏移词坐标,每个坐标区间[l,r]之后的正确值应该为[l + shift[l], r + shift[r]]

c++

#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<cmath> #include<map> using namespace std; // 通用 切割函数 函数 将字符串str根据delimiter进行切割 vector<string> split(const string& str, const string& delimiter) { vector<string> result; size_t start = 0; size_t end = str.find(delimiter); while (end != string::npos) { result.push_back(str.substr(start, end - start)); start = end + delimiter.length(); end = str.find(delimiter, start); } // 添加最后一个部分 result.push_back(str.substr(start)); return result; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); string text; getline(cin, text); string rangeStr; getline(cin, rangeStr); // 先解析range vector<string> splitRange = split(rangeStr, ","); int m = splitRange.size(); vector<vector<int>> range(m); for (int i = 0; i < m; i++) { string tmp = splitRange[i]; vector<string> position = split(tmp, " "); range[i] = {stoi(position[0]), stoi(position[1])}; } vector<int> deletePos; string res; // 预分配大小,防止反复扩容 res.reserve(text.size()); // 标记是否在引号中 bool isInQutoa = false; for (int i = 0; i < text.size(); i++) { char c = text[i]; // 前一个就是空格,需要去除 if (i > 0 && ' ' == text[i-1] && !isInQutoa && c == ' ') { deletePos.push_back(i); continue; } if ('\'' == c) { isInQutoa = !isInQutoa; } res.push_back(c); } // 处理区间 int n = text.size(); // shift表示i删除空格数量 vector<int> shift(n, 0); for (int i = 0; i < deletePos.size(); i++) { shift[deletePos[i]] -= 1; } for (int i = 1; i < n; i++) { shift[i] += shift[i-1]; } //输出结果字符串 cout << res << endl; // m = range.size(); for (int i = 0; i < m; i++) { int left = range[i][0]; int right = range[i][1]; cout << "[" << left + shift[left] <<", " << right + shift[right] << "]"; } return 0; }

JAVA

import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String text = br.readLine(); String rangeStr = br.readLine(); // 先解析 range String[] splitRange = rangeStr.split(","); int m = splitRange.length; int[][] range = new int[m][2]; for (int i = 0; i < m; i++) { String[] pos = splitRange[i].split(" "); range[i][0] = Integer.parseInt(pos[0]); range[i][1] = Integer.parseInt(pos[1]); } List<Integer> deletePos = new ArrayList<>(); StringBuilder res = new StringBuilder(text.length()); // 标记是否在引号中 boolean isInQuote = false; for (int i = 0; i < text.length(); i++) { char c = text.charAt(i); // 前一个是空格,当前也是空格,并且不在引号中,删除 if (i > 0 && text.charAt(i - 1) == ' ' && !isInQuote && c == ' ') { deletePos.add(i); continue; } if (c == '\'') { isInQuote = !isInQuote; } res.append(c); } int n = text.length(); int[] shift = new int[n]; for (int pos : deletePos) { shift[pos] -= 1; } for (int i = 1; i < n; i++) { shift[i] += shift[i - 1]; } // 输出处理后的文本 System.out.println(res.toString()); // 使用 StringBuilder 拼接坐标 StringBuilder sb = new StringBuilder(); for (int i = 0; i < m; i++) { int l = range[i][0]; int r = range[i][1]; sb.append("[").append(l + shift[l]).append(", ").append(r + shift[r]).append("]"); } System.out.println(sb.toString()); } }

Python

importsys text=sys.stdin.readline().rstrip('\n')range_str=sys.stdin.readline().strip()# 先解析 rangesplit_range=range_str.split(',')ranges=[]foriteminsplit_range:l,r=map(int,item.split())ranges.append((l,r))delete_pos=[]res=[]# 标记是否在引号中is_in_quote=Falsefori,cinenumerate(text):# 前一个是空格,当前也是空格,并且不在引号中,删除ifi>0andtext[i-1]==' 'andnotis_in_quoteandc==' ':delete_pos.append(i)continueifc=="'":is_in_quote=notis_in_quote res.append(c)res=''.join(res)n=len(text)# shift 表示 i 之前被删除的空格数量(负前缀和)shift=[0]*nforpindelete_pos:shift[p]-=1foriinrange(1,n):shift[i]+=shift[i-1]# 输出结果字符串print(res)# 输出区间out=[]forl,rinranges:out.append(f"[{l+shift[l]},{r+shift[r]}]")print("".join(out))

JavaScript

constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout});letinputLines=[];rl.on('line',line=>{inputLines.push(line.trim());// 当输入两行时开始处理if(inputLines.length===2){rl.close();}});rl.on('close',()=>{consttext=inputLines[0];constrangeStr=inputLines[1];// 解析 rangeconstsplitRange=rangeStr.split(',');constrange=splitRange.map(item=>item.split(' ').map(Number));// 删除空格位置constdeletePos=[];// 结果字符串constres=[];// 标记是否位于单引号中letisInQuote=false;for(leti=0;i<text.length;i++){constc=text[i];// 前一个是空格,当前也是空格,并且不在引号中,删除if(i>0&&text[i-1]===' '&&!isInQuote&&c===' '){deletePos.push(i);continue;}if(c==='\'')isInQuote=!isInQuote;res.push(c);}constn=text.length;constshift=Array(n).fill(0);// shift 表示 i 之前被删除的空格数量(负前缀和)for(constposofdeletePos)shift[pos]-=1;for(leti=1;i<n;i++)shift[i]+=shift[i-1];// 输出处理后的文本console.log(res.join(''));// 拼接坐标输出constcoords=range.map(([l,r])=>`[${l+shift[l]},${r+shift[r]}]`);console.log(coords.join(''));});

Go

packagemainimport("bufio""fmt""os""strings")funcmain(){in:=bufio.NewReader(os.Stdin)text,_:=in.ReadString('\n')text=strings.TrimRight(text,"\n")rangeStr,_:=in.ReadString('\n')rangeStr=strings.TrimSpace(rangeStr)// 先解析 rangesplitRange:=strings.Split(rangeStr,",")m:=len(splitRange)ranges:=make([][2]int,m)fori:=0;i<m;i++{fmt.Sscanf(splitRange[i],"%d %d",&ranges[i][0],&ranges[i][1])}deletePos:=make([]int,0)res:=make([]byte,0,len(text))// 标记是否在引号中isInQuote:=falsefori:=0;i<len(text);i++{c:=text[i]// 前一个是空格,当前也是空格,并且不在引号中,删除ifi>0&&text[i-1]==' '&&!isInQuote&&c==' '{deletePos=append(deletePos,i)continue}ifc=='\''{isInQuote=!isInQuote}res=append(res,c)}n:=len(text)// shift 表示 i 之前被删除的空格数量(负前缀和)shift:=make([]int,n)for_,p:=rangedeletePos{shift[p]--}fori:=1;i<n;i++{shift[i]+=shift[i-1]}// 输出结果字符串fmt.Println(string(res))// 输出区间fori:=0;i<m;i++{l:=ranges[i][0]r:=ranges[i][1]fmt.Printf("[%d, %d]",l+shift[l],r+shift[r])}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 3:17:38

技术架构的核心目标

技术架构的核心问题与目标 技术架构的核心在于解决系统在物理层面的稳定性、性能和扩展性问题&#xff0c;确保业务功能在复杂环境下可靠运行。以下是技术架构需重点解决的问题及实现目标&#xff1a;系统的物理组成 一个完整的系统由多个层级构成&#xff1a; 接入系统&#x…

作者头像 李华
网站建设 2026/4/25 16:43:44

算法导论第三版,学习日志,2.思考

2-1 &#xff08;在归并排序中对小数组采用插入排序&#xff09;虽然归并排序的最坏情况运行时间为 Θ(n lg n)&#xff0c;而插入排序的最坏情况运行时间为 Θ(n)&#xff0c;但是插入排序中的常量因子可能使得它在 n 较小时&#xff0c;在许多机器上实际运行得更快。因此&…

作者头像 李华
网站建设 2026/4/28 8:35:56

Python数据类型入门

引言 在Python编程中&#xff0c;数据类型就像“食材”&#xff0c;掌握它们才能做出美味的“代码大餐”。今天我们用生活中的例子&#xff0c;带大家认识Python最常用的6种数据类型&#xff0c;看完就能动手写代码&#xff01; 一、整数与浮点数&#xff1a;数字的两种形态 整…

作者头像 李华
网站建设 2026/4/18 12:35:05

基于遗传算法的多式联运车辆路径网络优优化研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真…

作者头像 李华
网站建设 2026/4/29 1:37:39

折叠与影像:高端手机技术演进的两大方向

每当为大家提供丰富选择的每年购物季时段来临之际&#xff0c;高端手机市场无一例外地都会出现新品发布会密集举行以及价格作出调整的情况。众多旗舰机型之中可以发现存在两个备受关注的技术方向&#xff0c;其中一个是折叠屏方向&#xff0c;另一个是影像旗舰方向&#xff0c;…

作者头像 李华