(新卷,200分)- 去除多余空格(Java JS Python)

(新卷,200分)- 去除多余空格(Java & JS & Python)

题目描述

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

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

输入描述

输入为两行字符串:

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

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

输出描述

输出为两行字符串:

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

用例
输入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中间多余的空格进行删除

输入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图示

用例2图示

我的解题思路如下:

定义一个数组needDel,记录需要被删除的空格的位置,定义一个变量quotaStart,记录是否已有未闭合的单引号,默认为false,即没有。

遍历输入字符串的每一个字符,

首先看被遍历的字符c是不是" "空格

  • 如果不是,则继续后面逻辑
  • 如果是,则看当前遍历字符的前一个字符是不是也是“ ”,如果不是则继续后面逻辑,如果是,则看quotaStart是否为false,若不是,则继续后面逻辑,若是,则说明空格c就是需要删除的空格,我们将其索引位置记录到needDel中

然后看遍历的字符c是不是单引号,若是,则将quotaStart取反(表示单引号开闭)

当扫描完后,我们就可以做两件事:

1、将输入字符串转为数组,根据needDel中记录的索引,来删除对应空格(即替换对应数组元素为“”空串),然后将数组join后打印

2、双重for,外层遍历needDel获得每一个要删除的空格的索引,内存遍历题目第一行输入的多组开始、结束位置arr,如果要删除的空格处于开始位置之前,则对应开始,结束位置都要减去1。

我们需要注意的是:我们不能基于原始的arr处理,应该对arr进行深拷贝后,对拷贝数组进行处理,因为如果基于原始arr进行处理,则会造成needDel中要删除的索引,和arr中记录的索引不同步。

比如 needDel = [18,19],arr = [ [8,15], [20,26], [43,45] ]

如果我们直接在arr上进行操作,则

首先needDel遍历出18,然后对比每一个arr范围的开始位置,发现[20,26], [43,45]在18后面,因此当18位置的空格删除后,这两个范围都要前移,因此arr变为了[[8,15], [19,25], [42,44]]。

之后needDel遍历出19,然后对比每一个arr范围的开始位置,发现和[19,25]产生了冲突,因为19坐标位置既是要删除的空格,又是一个关键词的起始位置,造成这种冲突的原因是此时needDel 19 和 arr范围[19,25] 已经不同步了。

因此我们要对,arr进行深拷贝后(数组元素是数组,需要深拷贝,可以使用最简单的JSON方法实现深拷贝),然后needDel和原始arr进行对比操作,具体范围移动操作在arr的拷贝对象上处理。

但是本题的文本字符长度length取值范围:[0, 100000];

这个有点大啊,会不会爆内存呢?有点悬。

JavaScript算法源码

克隆版(85%通过率)

/* JavaScript Node ACM模式 控制台输入获取 */ const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines = []; rl.on("line", (line) => { lines.push(line); if (lines.length === 2) { const str = lines[0]; const arr = lines[1].split(",").map((pos) => pos.split(" ").map(Number)); getResult(arr, str); lines.length = 0; } }); function getResult(arr, str) { let quotaStart = false; const needDel = []; for (let i = 0; i < str.length; i++) { if (str[i] === " " && str[i - 1] === " " && !quotaStart) { needDel.push(i); } if (str[i] === "'") { quotaStart = !quotaStart; } } const strArr = [...str]; const ans = JSON.parse(JSON.stringify(arr)); // 深拷贝 for (let del of needDel) { strArr[del] = ""; for (let i = 0; i < arr.length; i++) { const [start] = arr[i]; if (del < start) { ans[i][0]--; ans[i][1]--; } } } console.log(strArr.join("")); console.log(ans.map((ran) => `[${ran.join(", ")}]`).join("")); }

倒序版

/* JavaScript Node ACM模式 控制台输入获取 */ const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines = []; rl.on("line", (line) => { lines.push(line); if (lines.length === 2) { const str = lines[0]; const arr = lines[1].split(",").map((pos) => pos.split(" ").map(Number)); getResult(arr, str); lines.length = 0; } }); function getResult(arr, str) { let quotaStart = false; const needDel = []; for (let i = 0; i < str.length; i++) { if (str[i] === " " && str[i - 1] === " " && !quotaStart) { needDel.push(i); } if (str[i] === "'") { quotaStart = !quotaStart; } } const strArr = [...str]; for (let i = needDel.length - 1; i >= 0; i--) { const del = needDel[i]; strArr[del] = ""; for (let i = 0; i < arr.length; i++) { const start = arr[i][0]; if (del < start) { arr[i][0]--; arr[i][1]--; } } } console.log(strArr.join("")); console.log(arr.map((ran) => `[${ran.join(", ")}]`).join("")); }
Java算法源码

克隆版(85%通过率)

import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.nextLine(); Integer[][] ranges = Arrays.stream(sc.nextLine().split(",")) .map(s -> Arrays.stream(s.split(" ")) .map(Integer::parseInt) .toArray(Integer[]::new)) .toArray(Integer[][]::new); getResult(str, ranges); } public static void getResult(String str, Integer[][] ranges) { boolean quotaStart = false; ArrayList<Integer> needDel = new ArrayList<>(); for (int i = 0; i < str.length(); i++) { if (i > 0 && ' ' == str.charAt(i) && ' ' == str.charAt(i - 1) && !quotaStart) { needDel.add(i); } if ('\'' == str.charAt(i)) { quotaStart = !quotaStart; } } char[] cArr = str.toCharArray(); Integer[][] ans = Arrays.stream(ranges).map(Integer[]::clone).toArray(Integer[][]::new); for (Integer del : needDel) { cArr[del] = '\u0000'; for (int i = 0; i < ranges.length; i++) { int start = ranges[i][0]; if (del < start) { ans[i][0]--; ans[i][1]--; } } } System.out.println(new String(cArr).replace("\u0000", "")); StringBuilder sb = new StringBuilder(); for (Integer[] an : ans) { sb.append(Arrays.toString(an)); } System.out.println(sb); } }

倒序版

import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.nextLine(); Integer[][] ranges = Arrays.stream(sc.nextLine().split(",")) .map(s -> Arrays.stream(s.split(" ")).map(Integer::parseInt).toArray(Integer[]::new)) .toArray(Integer[][]::new); getResult(str, ranges); } public static void getResult(String str, Integer[][] ranges) { boolean quotaStart = false; ArrayList<Integer> needDel = new ArrayList<>(); String[] sArr = str.split(""); for (int i = 0; i < sArr.length; i++) { if (i > 0 && " ".equals(sArr[i]) && " ".equals(sArr[i - 1]) && !quotaStart) { needDel.add(i); } if ("'".equals(sArr[i])) { quotaStart = !quotaStart; } } for (int j = needDel.size() - 1; j >= 0; j--) { int del = needDel.get(j); sArr[del] = ""; for (int i = 0; i < ranges.length; i++) { int start = ranges[i][0]; if (del < start) { ranges[i][0]--; ranges[i][1]--; } } } StringBuilder tmp = new StringBuilder(); for (String s : sArr) { tmp.append(s); } System.out.println(tmp); StringBuilder sb = new StringBuilder(); for (Integer[] an : ranges) { sb.append(Arrays.toString(an)); } System.out.println(sb); } }
Python算法源码

克隆版

import copy # 输入获取 s = input() arr = list(map(lambda x: list(map(int, x.split())), input().split(","))) # 算法入口 def getResult(arr, s): quotaStart = False needDel = [] for i in range(len(s)): if s[i] == " " and s[i - 1] == " " and i > 0 and not quotaStart: needDel.append(i) if s[i] == "\'": quotaStart = not quotaStart sArr = list(s) ans = copy.deepcopy(arr) for d in needDel: sArr[d] = "" for i in range(len(arr)): start = arr[i][0] if d < start: ans[i][0] -= 1 ans[i][1] -= 1 print("".join(sArr)) print("".join(list(map(lambda x: str(x), ans)))) # 算法调用 getResult(arr, s)

倒序版

# 输入获取 s = input() arr = list(map(lambda x: list(map(int, x.split())), input().split(","))) # 算法入口 def getResult(arr, s): quotaStart = False needDel = [] for i in range(len(s)): if s[i] == " " and s[i - 1] == " " and i > 0 and not quotaStart: needDel.append(i) if s[i] == "'": quotaStart = not quotaStart sArr = list(s) needDel.reverse() for d in needDel: sArr[d] = "" for i in range(len(arr)): start = arr[i][0] if d < start: arr[i][0] -= 1 arr[i][1] -= 1 print("".join(sArr)) print("".join(list(map(lambda x: str(x), arr)))) # 算法调用 getResult(arr, s)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1201956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IP地址与端口号

IP地址及编址方式 IP地址基础概念 IP地址的本质 定义&#xff1a;用于唯一标识互联网上设备的逻辑地址结构&#xff1a;采用两级结构&#xff08;网络号 主机号&#xff09;唯一性&#xff1a;在整个互联网范围内是唯一的表示方法&#xff1a;点分十进制记法&#xff08;如…

制造业七大核心系统盘点——ERP、MES、WMS、SCM、PLM、SCADA、QMS

我这几年跑工厂、聊老板、跟信息化负责人沟通&#xff0c;听到最多的一句话不是我们没系统&#xff0c;而是&#xff1a;ERP 上了&#xff0c;车间还是一团乱MES 买了&#xff0c;数据没人信仓库有系统&#xff0c;库存还是对不上系统一堆&#xff0c;但问题一个没少这时候很多…

python之lession7-迭代器和生成器

案例一&#xff1a;迭代器访问 import syslist[1,2,3,4] it iter(list) while True:try:print(next(it))except StopIteration:sys.exit()案例二&#xff1a;使用class类创建一个迭代器 class MyNumbers:def __iter__(self):self.a 1return selfdef __next__(self):x self.a…

【毕业设计】基于springboot的蔬菜超市系统(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

DuCsps.dll文件丢失找不到 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

Java毕设项目推荐-基于SpringBoot+vue的保险公司人力资源管理系统基于springboot的寿险公司人力资源管理系统【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

linux Page Table 和 TLB 操作总结

以下是 Linux 内核中与页表和 TLB 操作对应的主要 API/函数列表&#xff0c;结合上述操作分类&#xff1a;页表&#xff08;Page Table&#xff09;相关 API 1. 地址转换操作内核 API/函数说明虚拟地址→物理地址virt_to_phys()、__pa()内核虚拟地址转物理地址物理地址→虚拟地…

【观成科技】C2框架AdaptixC2加密流量分析

工具介绍 AdaptixC2 是一款设计简洁、灵活且易于定制的命令与控制 (C2) 框架。与复杂且臃肿的大型 C2 平台不同&#xff0c;其轻量级设计使得攻击者能够更轻松地在不同环境中部署和调整。该框架采用模块化设计&#xff0c;支持C2工具的基本功能&#xff0c;例如在受感染的机器…

吴恩达深度学习课程五:自然语言处理 第二周:词嵌入(四)分层 softmax 和负采样

此分类用于记录吴恩达深度学习课程的学习笔记。 课程相关信息链接如下:原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai github课程资料,含课件与笔记:吴恩达深度学习教学资料 课程配套练习(中英)与答案…

nessus离线安装

Nessus 离线安装 只能免费试用30天 参考文档:https://docs.tenable.com/nessus/Content/InstallNessusOffline.htm 获取激活码 打开网址 https://www.tenable.com/products/nessus/nessus-essentials 填写邮箱,提交。…

2026年天猫代运营服务商排名前五权威发布:专业深度测评揭晓

2026年天猫淘宝代运营服务商权威测评与排名发布 随着电商行业进入精细化、全域化运营新阶段,品牌方对专业、高效、可量化的天猫淘宝代运营服务需求持续攀升。为帮助品牌方、企业主及商家在众多服务商中做出客观决策,…

用Microsoft Visual Studio Installer Projects打包程序

参考https://blog.csdn.net/m0_51961114/article/details/134908822 添加文件方式 方式一&#xff1a;如下图方式&#xff0c;可能有的.dll文件没添加上 方式二&#xff1a;直接按照自己的Debug/Release下所需的文件目录和文件在Application Folder下创建并添加相关文件&…

【博客园】Markdown语法如何设置图片大小

使用html标签,格式如下: <div align="center"><img src="图片路径" style="zoom:70%" alt="图片名称"/></div> <div align="center">&l…

一文看懂供应链五大核心模块:计划、采购、生产、仓储、物流如何联动?

你有没有遇到过这种情况&#xff1a;客户订单来了&#xff0c;仓库却没货&#xff0c;急得销售拍桌子&#xff1b;采购刚下单买了一堆原材料&#xff0c;结果生产说用不上&#xff0c;全堆在仓库吃灰&#xff1b;生产线开足马力干了一个月&#xff0c;结果做出来的东西没人要&a…

【计算机毕业设计案例】基于JAVA寿险公司人力资源管理系统基于springboot的寿险公司人力资源管理系统(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026年专业深度测评:增压花洒排名前五品牌权威榜单

2026年专业深度测评:增压花洒排名前五品牌权威榜单 随着消费者对居家沐浴体验要求的精细化提升,以及对老旧小区、高层住宅水压不足问题的普遍关注,具备稳定增压、节水增效功能的增压花洒已成为卫浴升级的核心需求。…

2026年度增压花洒供应商专业深度测评与排名前五权威发布

2026年度增压花洒品牌十大排名权威发布:基于EEAT框架的专业深度测评 一、开篇:行业趋势与测评声明 随着消费者对家居生活品质要求的持续精细化,卫浴产品的性能与耐用性成为核心关注点。其中,增压花洒凭借其优化出水…

敏捷团队的协作利器:当Cucumber BDD遇见自动化测试

博主正在参加CSDN博客之星评选&#xff0c;需要您的支持&#xff01; 投票链接&#xff1a;https://www.csdn.net/blogstar2025/detail/056 近年来&#xff0c;越来越多的软件开发团队在开发流程中采用敏捷方法论&#xff0c;以应对瞬息万变的市场需求。这一趋势给测试团队带来…

Docker-构建自己的Web-Linux系统-镜像kasmweb/ubuntu-jammy-desktop

下载镜像 docker pull kasmweb/ubuntu-jammy-desktop:1.16.18G大小 运行 docker run --rm -itd --shm-size512m -p 6901:6901 -e VNC_PWadmin kasmweb/ubuntu-jammy-desktop:1.16.1VNC_PWadmin自己改 访问 https://192.168.1.222:6901/ 用户名&#xff1a;kasm_user 密码&…

轻量化5G实验室搭建方案:中小高校的低成本路径

人才缺口持续扩大&#xff0c;搭建专业实验室成了高校通信、物联网专业的“刚需”&#xff01;但传统方案动辄百万投入、占地超百平&#xff0c;还得专人运维&#xff0c;预算有限的中小高校根本扛不住。别慌&#xff0c;不用堆高端设备&#xff0c;不用砸巨额资金&#xff0c;…