2026/4/18 17:49:42
网站建设
项目流程
公司网站建设需要注意的地方,响应式网站模版,wordpress二次开发手册chm,免费空间建站网站推荐去除多余空格 2025华为OD机试双机位B卷 - 华为OD上机考试双机位B卷 200分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录#xff5c;机考题库 算法考点详解
题目描述
去除文本多余空格#xff0c;但不去除配对单引号之间的多余空格。给出关…去除多余空格2025华为OD机试双机位B卷 - 华为OD上机考试双机位B卷 200分题型华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录机考题库 算法考点详解题目描述去除文本多余空格但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标去除多余空格后刷新关键词的起始和结束下标。条件约束:不考虑关键词起始和结束位置为空格的场景单词的的开始和结束下标保证涵盖一个完整的单词即一个坐标对开始和结束下标之间不会有多余的空格如果有单引号则用例保证单引号成对出现关键词可能会重复文本字符长度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之间有多余的空格但是因为有成对单引号不去除多余空格题解思路模拟解析输入将输入的关键词坐标按,分割每个坐标对再按空格分割得到[start, end]去除多余空格定义res存储结果字符串isInQuote表示是否在单引号中deletePos数组存储删除空格坐标去除空格逻辑如下如果当前字符和前一个字符都是空格且不在引号内则标记删除该空格记录其索引。不拼接到结果字符串中其它情况都拼接单引号出现时切换isInQuote状态维护坐标偏移线性扫描负前缀和创建长度为text.length()的数组shift初始化为 0。遍历被删除的空格索引deletePos将对应位置shift[pos] - 1。累加前缀和shift[i] shift[i-1]表示删除空格后每个位置的总偏移量。输出结果字符串res输出偏移词坐标每个坐标区间[l,r]之后的正确值应该为[l shift[l], r shift[r]]c#includeiostream #includevector #includestring #include utility #include sstream #includealgorithm #includecmath #includemap using namespace std; // 通用 切割函数 函数 将字符串str根据delimiter进行切割 vectorstring split(const string str, const string delimiter) { vectorstring 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 vectorstring splitRange split(rangeStr, ,); int m splitRange.size(); vectorvectorint range(m); for (int i 0; i m; i) { string tmp splitRange[i]; vectorstring position split(tmp, ); range[i] {stoi(position[0]), stoi(position[1])}; } vectorint 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删除空格数量 vectorint 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; }JAVAimport 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]); } ListInteger 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()); } }Pythonimportsys textsys.stdin.readline().rstrip(\n)range_strsys.stdin.readline().strip()# 先解析 rangesplit_rangerange_str.split(,)ranges[]foriteminsplit_range:l,rmap(int,item.split())ranges.append((l,r))delete_pos[]res[]# 标记是否在引号中is_in_quoteFalsefori,cinenumerate(text):# 前一个是空格当前也是空格并且不在引号中删除ifi0andtext[i-1] andnotis_in_quoteandc :delete_pos.append(i)continueifc:is_in_quotenotis_in_quote res.append(c)res.join(res)nlen(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[{lshift[l]},{rshift[r]}])print(.join(out))JavaScriptconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});letinputLines[];rl.on(line,line{inputLines.push(line.trim());// 当输入两行时开始处理if(inputLines.length2){rl.close();}});rl.on(close,(){consttextinputLines[0];constrangeStrinputLines[1];// 解析 rangeconstsplitRangerangeStr.split(,);constrangesplitRange.map(itemitem.split( ).map(Number));// 删除空格位置constdeletePos[];// 结果字符串constres[];// 标记是否位于单引号中letisInQuotefalse;for(leti0;itext.length;i){constctext[i];// 前一个是空格当前也是空格并且不在引号中删除if(i0text[i-1] !isInQuotec ){deletePos.push(i);continue;}if(c\)isInQuote!isInQuote;res.push(c);}constntext.length;constshiftArray(n).fill(0);// shift 表示 i 之前被删除的空格数量负前缀和for(constposofdeletePos)shift[pos]-1;for(leti1;in;i)shift[i]shift[i-1];// 输出处理后的文本console.log(res.join());// 拼接坐标输出constcoordsrange.map(([l,r])[${lshift[l]},${rshift[r]}]);console.log(coords.join());});Gopackagemainimport(bufiofmtosstrings)funcmain(){in:bufio.NewReader(os.Stdin)text,_:in.ReadString(\n)textstrings.TrimRight(text,\n)rangeStr,_:in.ReadString(\n)rangeStrstrings.TrimSpace(rangeStr)// 先解析 rangesplitRange:strings.Split(rangeStr,,)m:len(splitRange)ranges:make([][2]int,m)fori:0;im;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;ilen(text);i{c:text[i]// 前一个是空格当前也是空格并且不在引号中删除ifi0text[i-1] !isInQuotec {deletePosappend(deletePos,i)continue}ifc\{isInQuote!isInQuote}resappend(res,c)}n:len(text)// shift 表示 i 之前被删除的空格数量负前缀和shift:make([]int,n)for_,p:rangedeletePos{shift[p]--}fori:1;in;i{shift[i]shift[i-1]}// 输出结果字符串fmt.Println(string(res))// 输出区间fori:0;im;i{l:ranges[i][0]r:ranges[i][1]fmt.Printf([%d, %d],lshift[l],rshift[r])}}