【备战秋招】每日一题:2022.11.3-华为机试-去除多余空格

为了更好的阅读体检,可以查看我的算法学习网
在线评测链接:P1058

题目描述

塔子哥最近接到导师的一个任务,需要他帮忙去除文本多余空格,但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标,去除多余空格后刷新关键词的起始和结束下标。

但是塔子哥现在忙于其他事情没有时间做这个,你能帮他一下吗?

任务的条件约束如下:

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

输入描述

输入为两行字符串:

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

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

输出描述

输出为两行字符串:

第一行:去除多余空格后的文本。

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

样例

输出

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]

题目思路

直接模拟这个过程就可以了,在删除时用一个记录删除掉的下标,其目的是为了处理最后的关键词的坐标

同时为了方便处理我们将关键词的坐标用三个捆绑变量存储下来,分别是l, r, i,分别表示坐标的左右区间,和关键词的原本序号(自己设定的)。同时,根据题意,我们在单引号之间不能删空格,固可以使用一个变量haveq左右引号的情况

在修改关键词坐标时,我们先将关键词的坐标按左区间的大小进行排序,然后遍历关键词坐标,用类似队列的思想,记录小于当前关键词左区间的删除掉的空格的下标,这样子处理的好处是时间复杂度是 O ( n ) O(n) O(n),具体看代码

最后输出时记得将关键词坐标按原本的序号排好序再输出

C++代码

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
const int N = 1e5 + 5;
char s[N];
struct keyword{int l, r, i;
};
int main() {gets(s);vector<keyword> keywords;int l, r, cnt = 0;while (~scanf("%d %d,", &l, &r)) keywords.emplace_back(l, r, ++cnt);int haveq = false, n = strlen(s);vector<int> del_index;for (int i = 0; i < n; ++i) {if (s[i] == ' ' && s[i + 1] == ' ' && !haveq) { // 删除del_index.push_back(i);continue;} else if (s[i] == '\'') {haveq = !haveq;}putchar(s[i]);}puts("");sort(keywords.begin(), keywords.end(), [](keyword& a, keyword& b) {return a.l < b.l;});int indx = 0, vlen = del_index.size(), def = 0;for (auto& [l, r, i] : keywords) {while (indx < vlen && del_index[indx] < l) {indx += 1;def += 1; // 记录偏移量}l -= def, r -= def;}sort(keywords.begin(), keywords.end(), [](keyword& a, keyword& b) {return a.i < b.i;});for (auto [l, r, i] : keywords) {printf("[%d,%d]", l, r);}return 0;
}

Python代码

def take_l(keyword):return keyword[0]def take_i(keyword):return keyword[2]s = str(input())
kw = list(map(str, input().split(',')))
keywords = []
cnt = 0
for tmp in kw:cnt += 1arr = tmp.split(' ')l, r, i = int(arr[0]), int(arr[1]), cntkeywords.append([l, r, i])n = len(s)
s += '\0'
del_index, haveq, ans = [], False, ''
for i in range(n):if s[i] == ' ' and s[i + 1] == ' ' and not haveq:del_index.append(i)continueelif s[i] == '\'':haveq = not haveqans += s[i]
keywords.sort(key = take_l)
indx, vlen, deff = 0, len(del_index), 0
for lri in keywords:while indx < vlen and del_index[indx] < lri[0]:indx += 1deff += 1lri[0] -= defflri[1] -= deffkeywords.sort(key=take_i)
print(ans)
for lri in keywords:print('[' + str(lri[0]) + ',' + str(lri[1]) + ']', end='')

Java代码

import java.util.*;class keyword {public int l;public int r;public int i;public keyword(){}public keyword(int l, int r, int i) {this.l = l;this.r = r;this.i = i;}
}
class cmpl implements Comparator<keyword> {public int compare(keyword a, keyword b) {if (a.l < b.l)return -1;return 1;}
}
class cmpi implements Comparator<keyword> {public int compare(keyword a, keyword b) {if (a.i < b.i)return -1;return 1;}
}
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String s = scanner.nextLine();int n = s.length(), cnt = 0;String[] kw = scanner.nextLine().split(",");List<keyword> keywords = new ArrayList<>();for (String tmp : kw) {String[] str = tmp.split(" ");int l = Integer.valueOf(str[0]).intValue();int r = Integer.valueOf(str[1]).intValue();keywords.add(new keyword(l, r, ++cnt));}s += '\0';List<Integer> del_index = new ArrayList<>();Boolean haveq = false;String ans = "";for (int i = 0; i < n; i++) {if (s.charAt(i) == ' ' && s.charAt(i + 1) == ' ' && !haveq) {del_index.add(i);continue;} else if (s.charAt(i) == '\'') {haveq = !haveq;}ans += s.charAt(i);}keywords.sort(new cmpl());int indx = 0, def = 0, vlen = del_index.size();for (keyword lri : keywords) {while (indx < vlen && del_index.indexOf(indx) < lri.l) {indx += 1;def += 1;}lri.l -= def;lri.r -= def;}keywords.sort(new cmpi());System.out.println(ans);for (keyword lri : keywords) {System.out.print("[" + lri.l + "," + lri.r + "]");}}
}

Js代码

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';process.stdin.on('data', (data) => {input += data;return;
});
process.stdin.on('end', () => {input = input.split('\n')let s = input[0]let tmp = input[1].split(',')let keywords = []let cnt = 0for (let kw of tmp) {cnt += 1let num = kw.split(' ').map(Number)keywords.push([num[0], num[1], cnt])}let n = s.lengths += '\0'let del_index = new Array()let haveq = falselet ans = ''for (let i = 0; i < n; i++) {if (s[i] == ' ' && s[i + 1] == ' ' && !haveq) {del_index.push(i)continue} else if (s[i] == '\''){haveq = !haveq}ans += s[i]}keywords.sort((a, b) => {if (a[0] < b[0])return -1return 1})let indx = 0let vlen = del_index.length let def = 0for (let lri of keywords) {while (indx < vlen && del_index[indx] < lri[0]) {indx += 1def += 1}lri[0] -= deflri[1] -= def}keywords.sort((a, b) => {if (a[2] < b[2])return -1return 1})ans += '\n'for (let lri of keywords) {ans += '[' + lri[0] + ',' + lri[1] + ']'}console.log(ans)
})

题目内容均收集自互联网,如如若此项内容侵犯了原著者的合法权益,可联系我: (CSDN网站注册用户名: 塔子哥学算法) 进行删除。

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

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

相关文章

【JavaScript】ES6新特性(5)

16. Promise Promise 是异步编程的一种解决方案&#xff0c;比传统的解决方案回调函数, 更合理和更强大 ES6 将其写进了语言标准&#xff0c;统一了用法&#xff0c;原生提供了Promise对象 指定回调函数方式更灵活易懂解决异步 回调地狱 的问题 16.1 回调地狱 当一个回调函数…

并发编程 - Event Bus 设计模式

文章目录 Pre设计CodeBus接口自定义注解 Subscribe同步EventBus异步EventBusSubscriber注册表RegistryEvent广播Dispatcher 测试简单的Subscriber同步Event Bus异步Event Bus Pre 我们在日常的工作中&#xff0c;都会使用到MQ这种组件&#xff0c; 某subscriber在消息中间件上…

AIGC - Stable Diffusion 的 AWPortrait 1.1 模型与 Prompts 设置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131565908 AWPortrait 1.1 网址&#xff1a;https://www.liblibai.com/modelinfo/721fa2d298b262d7c08f0337ebfe58f8 介绍&#xff1a;AWPortrai…

使用LiteSpeed缓存插件将WordPress优化到100%的得分

页面速度优化应该是每个网站所有者的首要任务&#xff0c;因为它直接影响WordPress SEO。此外&#xff0c;网站加载的时间越长&#xff0c;其跳出率就越高。这可能会阻止您产生转化并为您的网站带来流量。 使用正确的工具和配置&#xff0c;缓存您的网站可以显着提高其性能。因…

Spring系列3 -- 更简单的读取和存储对象

前言 上一篇章总结了,Spring的创建与使用,通过创建Maven项目配置Spring的环境依赖,创建Spring框架的项目,然后通过在Resource目录下创建Spring-config.xml配置文件,添加<bean></bean>标签将我们需要的bean对象注入到容器中,然后通过ApplicationContext获取Spring上…

web服务端接收多用户并发上传同一文件,保证文件副本只存在一份(附go语言实现)

背景 对于一个文件服务器来说&#xff0c;对于同一文件&#xff0c;应该只保存一份在服务器上。基于这个原则&#xff0c;引发出本篇内容。 本篇仅阐述文件服务器在同一时间接收同一文件的并发问题&#xff0c;这种对于小体量的服务来说并不常见&#xff0c;但是最好还是要留…

文本分析-使用Python做词频统计分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【滑动窗口】209. 长度最小的子数组

209. 长度最小的子数组 解题思路 滑动窗口设置前后指针滑动窗口内的元素之和总是大于或者等于s滑动窗口的起始位置: 如果窗口的值大于等于s 窗口向前移动窗口结束位置:for循环的j class Solution {public int minSubArrayLen(int target, int[] nums) {int left 0;// 滑动窗口…

学习系统编程No.28【多线程概念实战】

引言&#xff1a; 北京时间&#xff1a;2023/6/29/15:33&#xff0c;刚刚更新完博客&#xff0c;目前没什么状态&#xff0c;不好趁热打铁&#xff0c;需要去睡一会会&#xff0c;昨天睡的有点迟&#xff0c;然后忘记把7点到8点30之间的4个闹钟关掉了&#xff0c;恶心了我自己…

使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令

使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令 文章目录 使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令一、Rust 概述使用场景优点缺点 二、功能实现1、代码2、运行日志3、服务器文件 一、Rust 概述 Rust 已经听了无数遍&#xff0c;我很清楚它很强&am…

LVS-DR集群

目录 一、构建LVS-DR集群的步骤 实验环境准备&#xff1a; 1、配置负载调度器&#xff08;192.168.40.200&#xff09; 1.1 配置虚拟 IP 地址&#xff08;VIP&#xff1a;192.168.40.190&#xff09; 1.2 调整 proc 响应参数 1.3 配置负载分配策略 2. 部署共享存储&#xf…

Elasticsearch 基本使用(五)查询条件匹配方式(query query_string)

查询条件匹配方式 概述querytermtermsrangematch_allmatchmatch 匹配精度问题 match_phrasematch_pharse_prefixmatch_bool_prefixmulti_match query_string简单查询一个字段在多个字段上应用同一个条件 &#xff08;类似multi_match&#xff09;在所有字段上应用同一个条件 &a…