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

news2024/11/18 13:34:17

为了更好的阅读体检,可以查看我的算法学习网
在线评测链接: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 += 1
    arr = tmp.split(' ')
    l, r, i = int(arr[0]), int(arr[1]), cnt
    keywords.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)
        continue
    elif s[i] == '\'':
        haveq = not haveq
    ans += 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 += 1
        deff += 1
    lri[0] -= deff
    lri[1] -= deff

keywords.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 = 0
    for (let kw of tmp) {
        cnt += 1
        let num = kw.split(' ').map(Number)
        keywords.push([num[0], num[1], cnt])
    }
    let n = s.length
    s += '\0'
    let del_index = new Array()
    let haveq = false
    let 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 -1
        return 1
    })
    let indx = 0
    let vlen = del_index.length 
    let def = 0
    for (let lri of keywords) {
        while (indx < vlen && del_index[indx] < lri[0]) {
            indx += 1
            def += 1
        }
        lri[0] -= def
        lri[1] -= def
    }
    keywords.sort((a, b) => {
        if (a[2] < b[2])
            return -1
        return 1
    })
    ans += '\n'
    for (let lri of keywords) {
        ans += '[' + lri[0] + ',' + lri[1] + ']'
    }
    console.log(ans)
})

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

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

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

相关文章

豆瓣T250电影

爬取电影名字、年份、评分、评价人数 import requests import re import csv"""1、拿到页面源代码"""headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.…

IntelliJ IDEA安装Mybatis 插件Free Mybatis plugin

需求描述 在开发一些Mybatis的项目&#xff0c;经常需要写一个Mapper接口&#xff0c;在找代码过程&#xff0c;经常需要去找对应的xml文件&#xff0c;所以非常的不方便。自从有了免费的free-mybatis-plugin插件之后 &#xff0c;在可以实现在idea里一键跳转到对应的xml文件&…

CRC16_Verilog

CRC校验 CRC即循环冗余校验码&#xff08;Cyclic Redundancy Check&#xff09;&#xff1a;是数据通信领域中最常用的一种查错校验码&#xff0c;其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查&#xff08;CRC&#xff09;是一种数据传输检错功能&#xff0c;…

Mac系统远程连接Windows11

一、远程桌面连接Windows11 1、下载并安装Microsoft Remote Desktop for mac。&#xff08;Microsoft Remote Desktop for mac简介&#xff0c;下载链接&#xff09; 2、Windows11开启远程桌面。 3、为当前Windows11账号设置密码。 二、ssh连接Windows11 1、下载并安装OpenSS…

numpy与python版本不匹配-ImportError: Unable to import required dependencies: numpy

问题 你在运行python代码的时候&#xff0c;是否遇到过下面这种错误 ImportError: Unable to import required dependencies: numpy: IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!Importing the numpy C-extensions failed. This error can happen f…

【优选算法题练习】day2

文章目录 一、11. 盛最多水的容器1.题目简介2.解题思路3.代码4.运行结果 二、611. 有效三角形的个数1.题目简介2.解题思路3.代码4.运行结果 三、剑指 Offer 57. 和为s的两个数字1.题目简介2.解题思路3.代码4.运行结果 总结 一、11. 盛最多水的容器 1.题目简介 11. 盛最多水的…

笔试刷过的题---选择

1.若使求解TSP算法&#xff0c;则时间复杂度是&#xff08;&#xff09; 2.用1*3的瓷砖密铺3*20的地板有&#xff08;&#xff09;种方式 答&#xff1a;1278 3.可以用于路径规划的算法 有多种算法可以用于路径规划&#xff0c;以下是一些常见的算法&#xff1a; Dijkstra算…

在电脑上,一秒钟快速复制汇总上百成千个文件(夹》到指定文件夹中

在日常生活和工作中&#xff0c;我们经常需要对大量的文件进行重命名&#xff0c;以方便整理和管理。使用高效的文件批量改名软件可以极大地提高我们的工作效率。本文将介绍一款功能强大的文件批量改名软件&#xff0c;并演示如何使用它来实现快速的文件重命名。 该软件的名称…

Spring异常处理器

文章目录 1. 异常分析2. 异常处理器2.1 异常处理器核心2.2 异常处理顺序 3. 自定义异常 1. 异常分析 问题:   程序允许不免的在各层都可能会产生异常&#xff0c;我们该如何处理这些异常? 如果只是在方法里面单独使用 try… catch… 语句去一个一个的进行捕捉处理的话&#x…

【JUC并发编程】读写锁:ReadWriteLock

一、介绍 二、代码演示 1. 不使用读写锁 package readwritelock;import java.util.HashMap; import java.util.Map;/*** author swaggyhang* create 2023-07-09 11:16*/ public class Test01 {public static void main(String[] args) {MyCache myCache new MyCache();for (…

功夫这个词,西方语言中没有

功夫这个词&#xff0c;西方语言中没有 功夫一种意思是武侠片的武功之意 另一种意思就是【下功夫】 趣讲大白话&#xff1a;只要功夫深&#xff0c;铁棒磨成针 【趣讲信息科技220期】 #非著名IT人安志强的趣味笔记# **************************** 西方词语怎么翻译功夫的&#…

EtherNet/IP转CAN网关can协议分为几种

生产管理设备中&#xff0c;会有设备与其他设备的协议不同&#xff0c;数据无法互通&#xff0c;让你的工作陷入困境。这时&#xff0c;一款神奇的产品出现了——远创智控YC-EIP-CAN通讯网关&#xff01; 1, 这款通讯网关采用ETHERNET/IP从站功能&#xff0c;可以将各种CAN总…

什么事RPC并实现一个简单的RPC

1. 基本的RPC模型 主要介绍RPC是什么&#xff0c;基本的RPC代码&#xff0c;RPC与REST的区别&#xff0c;gRPC的使用 1.1 基本概念 RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用&#xff0c;简单的理解是一个节点请求另一个节点提供的服务本地过程调用&am…

管理类联考——逻辑——技巧篇——数字编码——公式

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

特斯拉12V低压系统存在问题:刹车失灵还能怪司机吗?

特斯拉汽车失控加速事件引发全球关注&#xff0c;美国NHTSA&#xff08;交通运输安全委员会&#xff09;和特斯拉之前将责任归咎于司机误操作。但一位研究人员提出新解释&#xff0c;并指出特斯拉的12V低压系统可能存在问题&#xff0c;特别是在高负载状态下。 此研究认为&…

git上传文件到Gitee报错“error: failed to push some refs to https://gitee.com/xxxx”

文章目录 前言一、创建项目仓库二、创建工作区三、配置 LFS四、上传镜像文件 前言 我要将一个 4.27 GB 的文件上传到 Gitee 上&#xff0c;但是出现了下面这样的报错 error: failed to push some refs to https://gitee.com/xxxx/centos.git 因此记录一下解决报错的方法。 一、…

基于粤嵌gec6818开发板嵌入式开发电子相册,音乐播放,视频播放,2048游戏

一、功能与要求 实现功能&#xff1a;本系统需要使用粤嵌的GEC-6818开发板设计一款娱乐影音系统&#xff0c;其中包括图片显示&#xff08;相册&#xff09;、音乐播放、视频播放&#xff0c;游戏四个部分&#xff0c;在每个部分内部&#xff0c;具有操控各个部分的功能触摸按…

UNIAPP调用讯飞语音评测API

1、历经千辛万苦&#xff0c;UNIAPP调用评测API终于完成&#xff0c;在此做下总结下&#xff1a;首先看效果&#xff01; 2、实现第1步&#xff0c;首先是鉴权&#xff0c;用到的CryptoJS等工具都可以从讯飞和uniapp官方获取 import * as base64 from "base-64" impo…

redis操作问题

使用redisTemplate 往set集合中批量添加值 # 第一种办法就是for循环&#xff0c;每次进行setfor (int i 0; i < 1000000; i) {redisTemplate.opsForSet().add("key",i);} # 第二中办法就是使用HashSet批量添加数据Set set new HashSet<>();for (int i 1…

mybatisplus生成代码

导包&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>m…