Golang leetcode151 翻转字符串中的单词 双指针 常规+进阶

news/2024/7/24 6:53:54 标签: golang, 算法, 后端, 开发语言

翻转字符串中的单词 leetcode151

常规做法 双指针

func reverseWords(s string) string {
WordList := []string{}
left := 0
L := len(s)
//fmt.Println(L)

	for i, i2 := range s {
		//去除重复的空格
		if i > 0 && s[i-1] == ' ' && i2 == ' ' {
			left++
			continue
		}

		//不为空格时右指针移动,并且如果最后一位也为字母时添加到存储表
		if i2 != ' ' {
			if i == L-1 {
				WordList = append(WordList, s[left:i+1])
			}
		} else { //当为空格时,将当前的左右指针对应的单词放入存储表,同时给左指针赋值
			if i != 0 {
				WordList = append(WordList, s[left:i])
			}
			left = i + 1
		}
	}
	S := WordList[0]
	for i, s2 := range WordList {
		if i != 0 {
			S = s2 + " " + S
		}
	}
	return S
}

进阶做法 空间复杂度O(1)

解题思路如下:

  • 移除多余空格
  • 将整个字符串反转
  • 将每个单词反转
func reverseWords(s string) string {
	// 1.去除字符串中多余的空格
	b := []byte(s) //将字符串转换为字符切片
	slow, l := 0, len(b)
	for fast := 0; fast < l; fast++ {
		if b[fast] != ' ' { //直接让fast指针移动到第一个字母的位置
			if slow != 0 { //排除字符串开头的空格
				b[slow] = ' ' //保留单词间的空格
				slow++
			}
			for fast < l && b[fast] != ' ' {
				b[slow] = b[fast]
				slow++
				fast++
			}
		}
	}
	b = b[:slow] //取slow之前的字符串
	// 2.反转整体字符串
	reverse(b)
	// 3.反转每个单词
	last := 0 //慢指针
	l = len(b)
	for i := 0; i <= l; i++ { //注意这里是i<=l
		if i == l || b[i] == ' ' { //当i等于字符串长度或者值为空,i==l必须写在前面因为b[l]不存在会报错
			reverse(b[last:i]) //反转每个单词,左闭右开
			last = i + 1
		}
	}
	return string(b) //将字符切片转换为字符串
}
func reverse(s []byte) {
L := len(s)
//双指针
left, right := 0, L-1

for left < right {
s[left], s[right] = s[right], s[left]
left++
right--
}
}

http://www.niftyadmin.cn/n/5333036.html

相关文章

Android Google 开机向导定制 setup wizard

Android 开机向导定制 采用 rro_overlays 机制来定制开机向导&#xff0c;定制文件如下&#xff1a; GmsSampleIntegrationOverlay$ tree . ├── Android.bp ├── AndroidManifest.xml └── res └── raw ├── wizard_script_common_flow.xml ├── wizard_script…

【Python3】【力扣题】392. 判断子序列

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;遍历字符串s&#xff0c;使用一个列表依次记录在字符串t中的位置&#xff0c;若没有该字母则返回False&#xff0c;若索引号小于上一个字母的索引号&#xff0c;返回False。否则返回True。…

centos7 arm服务器编译升级安装动态库libstdc++.so.6,解决GLIBC和CXXABI版本低的问题

前言 由于centos7内置的libstdc.so.6版本太低&#xff0c;导致安装第三方包的时候&#xff0c;会报“CXXABI_1.3.8”不存在等问题。 自带的打印如下&#xff1a; strings /usr/lib64/libstdc.so.6 | grep GLIBC strings /usr/lib64/libstdc.so.6 | grep CXXABI 如图 升级 注…

外观模式介绍

目录 一、外观模式介绍 1.1 外观模式定义 1.2 外观模式原理 1.2.1 外观模式类图 1.2.2 模式角色说明 1.2.3 示例代码 二、外观模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 类图 2.2.2 具体实现 2.2.2.1 灯光类 2.2.2.2 电视类 2.2.2.3 空调类 2.2.2.4 外观面板类…

阿里云国外云服务器多少钱?2024年最新价格

阿里云国外服务器优惠活动「全球云服务器精选特惠」&#xff0c;国外服务器租用价格24元一个月起&#xff0c;免备案适合搭建网站&#xff0c;部署独立站等业务场景&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云国外服务器优惠活动&#xff1a; 全球云服务器精选特惠…

Linux 常用的一些命令

目录 一、常用文件管理命令二、tmux 和 vimtmuxvim 三、[Shell语法](https://blog.csdn.net/weixin_43288201/article/details/105643692)四、git五、sshReference 一、常用文件管理命令 (1) ctrl c: 取消命令&#xff0c;并且换行 (2) ctrl u: 清空本行命令 (3) tab键&#x…

亚信安慧AntDB:聚焦执行性能,带给用户前所未有的数据库体验

亚信安慧AntDB数据库是一款国产数据库产品&#xff0c;以其独特之处和出色表现而备受瞩目。它的诞生源于对现实问题的深入思考和实践经验&#xff0c;旨在提供一种高效、稳定、可靠的数据库解决方案。下面将从多个角度介绍AntDB的特点和优势。 首先&#xff0c;AntDB以服务人数…

java基础之线程安全问题以及线程安全集合类

线程安全问题 当多个线程同时访问同一个临界资源时,原子操作可能被破坏,会导致数据丢失, 就会触发线程安全问题 临界资源: 被多个线程同时访问的对象 原子操作: 线程访问临界资源的过程中不可更改和缺失的操作 互斥锁 每个对象都默认拥有互斥锁, 该锁默认不开启. 当开启互斥…