【华为OD机试真题】78、去除多余空格(200分)

Go 复制代码
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

type keywordPosition struct {
	start int
	end   int
}

func str2slice(str string) []string {
	length := len(str)
	list := make([]string, length)
	for i, i2 := range str {
		list[i] = string(i2)
	}
	return list
}

func tidyKeywordPositionStr(str string) []*keywordPosition {
	keywordPositions := strings.Split(str, ",")
	list := make([]*keywordPosition, 0)
	for _, positionStr := range keywordPositions {

		tempPositionArray := strings.Split(positionStr, " ")
		start, _ := strconv.Atoi(tempPositionArray[0])
		end, _ := strconv.Atoi(tempPositionArray[1])
		item := &keywordPosition{
			start: start,
			end:   end,
		}
		list = append(list, item)
	}
	return list
}

func main() {
	var inputStr, keywordPositionStr string
	scanner := bufio.NewScanner(os.Stdin)
	if scanner.Scan() {
		inputStr = scanner.Text()
	}
	if scanner.Scan() {
		keywordPositionStr = scanner.Text()
	}

	inputStrSlice := str2slice(inputStr)
	KeywordPositions := tidyKeywordPositionStr(keywordPositionStr)

	newStrSlice := make([]string, 0)
	//是否为但括号区域
	isJump := false

	for i, r := range inputStrSlice {
		if !isJump && r == "'" {
			isJump = true
		}

		if isJump {
			newStrSlice = append(newStrSlice, r)

			if r == "'" {
				isJump = false
			}
			continue
		}

		//出现需要删除的空格下标
		tempIndex := -1

		if r == " " {
			//上一个是不是空格
			if i > 0 {
				if inputStrSlice[i-1] != r {
					newStrSlice = append(newStrSlice, r)
				} else {
					tempIndex = i
				}
			}
		} else {
			newStrSlice = append(newStrSlice, r)
		}

		//更新原来关键词的索引
		if tempIndex > -1 {
			for i2, position := range KeywordPositions {
				if tempIndex <= position.start {
					position.start--
					position.end--
				}
				if tempIndex > position.start && tempIndex <= position.end {
					position.end--
				}
				KeywordPositions[i2] = position
			}
		}

	}

	//输出
	fmt.Println(strings.Join(newStrSlice, ""))
	outPutPositionStr := ""
	for _, position := range KeywordPositions {
		outPutPositionStr = fmt.Sprintf("%s[%d, %d]", outPutPositionStr, position.start, position.end)
	}
	fmt.Println(outPutPositionStr)
}
相关推荐
Sheep Shaun5 分钟前
STL:list,stack和queue
数据结构·c++·算法·链表·list
_OP_CHEN10 分钟前
【C++数据结构进阶】吃透 LRU Cache缓存算法:O (1) 效率缓存设计全解析
数据结构·数据库·c++·缓存·线程安全·内存优化·lru
white-persist11 分钟前
【攻防世界】reverse | tt3441810 详细题解 WP
java·c语言·开发语言·数据结构·c++·算法·安全
量子炒饭大师16 分钟前
Cyber骇客的树状逻辑数据——【初阶数据结构与算法】树
c语言·数据结构·c++·二叉树·
lxh011320 分钟前
缺失的第一个正数
数据结构·算法
杨福瑞25 分钟前
数据结构:⼆叉树(1)
c语言·数据结构
zore_c28 分钟前
【数据结构】二叉树初阶——超详解!!!(包含二叉树的实现)
c语言·开发语言·数据结构·经验分享·笔记·算法·链表
LYFlied10 小时前
【每日算法】LeetCode 153. 寻找旋转排序数组中的最小值
数据结构·算法·leetcode·面试·职场和发展
jianfeng_zhu13 小时前
整数数组匹配
数据结构·c++·算法
yueqingll13 小时前
032、数据结构之代码时间复杂度和空间复杂度的判断:从入门到实战
数据结构