代码随想录算法训练营Day08 | 344.反转字符串、541.反转字符串II、151.翻转字符串里的单词

71 阅读2分钟

LeetCode题目

344.反转字符串

题目链接:Reverse String - LeetCode

代码如下:

func reverseString(s []byte) {
	left := 0
	right := len(s) - 1
	for left < right {
		s[left], s[right] = s[right], s[left]
		left++
		right--
	}
}

541.反转字符串II

题目链接:Reverse String II - LeetCode

代码如下:

func reverse(s []byte) {
	left := 0
	right := len(s) - 1
	for left < right {
		s[left], s[right] = s[right], s[left]
		left++
		right--
	}
}

func reverseStr(s string, k int) string {
	ss := []byte(s)
	length := len(s)
	for i := 0; i < length; i += 2 * k {
		if i+k <= length {
			reverse(ss[i : i+k])
		} else {
			reverse(ss[i:length])
		}
	}
	return string(ss)
}

151.翻转字符串里的单词

题目链接:Reverse Words in a String - LeetCode

代码如下:

func removeExtraSpaces(s []byte) string {
	slow := 0
	for fast := 0; fast < len(s); fast++ {
		if s[fast] != ' ' {
			if slow != 0 {
				s[slow] = ' '
				slow++
			}
			for fast < len(s) && s[fast] != ' ' {
				s[slow] = s[fast]
				fast++
				slow++
			}
		}
	}
	return string(s[:slow])
}

func reverse(s []byte, start, end int) []byte {
	i, j := start, end
	for i < j {
		s[i], s[j] = s[j], s[i]
		i++
		j--
	}
	return s
}

func reverseWords(s string) string {
	s = removeExtraSpaces([]byte(s))
	ss := reverse([]byte(s), 0, len(s)-1)
	start := 0
	for i := 0; i <= len(ss); i++ {
		if i == len(ss) || ss[i] == ' ' {
			ss = reverse(ss, start, i-1)
			start = i + 1
		}
	}
	return string(ss)
}

卡码网题目

54.替换数字

题目链接:54. 替换数字(第八期模拟笔试) (kamacoder.com)

代码如下:

package main

import (
	"fmt"
)

func replaceNumber(strByte []byte) string {
	oldIndex := len(strByte) - 1
	count := 0
	for i := 0; i < len(strByte); i++ {
		if strByte[i] >= '0' && strByte[i] <= '9' {
			count++
		}
	}
	for i := 0; i < count; i++ {
		strByte = append(strByte, []byte("     ")...)
	}
	newIndex := len(strByte) - 1
	for oldIndex >= 0 {
		if strByte[oldIndex] >= '0' && strByte[oldIndex] <= '9' {
			strByte[newIndex] = 'r'
			newIndex--
			strByte[newIndex] = 'e'
			newIndex--
			strByte[newIndex] = 'b'
			newIndex--
			strByte[newIndex] = 'm'
			newIndex--
			strByte[newIndex] = 'u'
			newIndex--
			strByte[newIndex] = 'n'
			newIndex--
		} else {
			strByte[newIndex] = strByte[oldIndex]
			newIndex--
		}
		oldIndex--
	}
	return string(strByte)
}

func main() {
	var strByte []byte
	fmt.Scanln(&strByte)
	newString := replaceNumber(strByte)
	fmt.Println(newString)
}

55.右旋转字符串

题目链接:55. 右旋字符串(第八期模拟笔试) (kamacoder.com)

代码如下:

package main

import "fmt"

func reverse(s []byte, start, end int) {
	i, j := start, end
	for i < j {
		s[i], s[j] = s[j], s[i]
		i++
		j--
	}
}

func main() {
	var n int
	var strByte []byte
	fmt.Scanln(&n)
	fmt.Scanln(&strByte)
	reverse(strByte, 0, len(strByte)-1)
	reverse(strByte, 0, n-1)
	reverse(strByte, n, len(strByte)-1)
	fmt.Println(string(strByte))
}

总结

  1. 对于线性数据结构,填充或者删除,后序处理会高效的多