利用golang的字符串解决leetcode翻转字符串里的单词

题目

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:

输入: "the sky is blue"

输出: "blue is sky the"

示例 2:

输入: " hello world! "

输出: "world! hello"

解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:

输入: "a good example"

输出: "example good a"

解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

说明:

无空格字符构成一个单词。

输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

解法一

全部使用golang的strings包里的方法来解题。

func reverseWords(s string) string {
 var reverseSeg []string
 //获取去除空格后的单词数组
 seg := strings.Fields(s)
 //翻转单词数组
 for i := len(seg)-1;i>=0;i-- {
  reverseSeg = append(reverseSeg,seg[i])
 }
 //数组-》由空格间隔的字符串
 return strings.Join(reverseSeg," ")
}

解法二

func reverseWords(s string) string {
 var result string
 //获取去除空格后的单词数组
 str := strings.Split(s," ")
 //倒序组装单词和空格
 for i:=len(str)-1;i>=0;i-- {
  if len(str[i])==0 {
   continue
  }
  result += str[i]+" "
 }
 if len(result)==0 {
  return ""
 }
 return result[:len(result)-1]
}

解法三

func reverseWords(s string) string {
 sL := strings.Split(s, " ")
 c := len(sL)
 n := 0//表示实际有效单词的长度
 i := 0//数组长度
 for {
 if i >= c {
 break
 }
 if sL[i] == "" {
 i++
 continue
 } else {
 //将有效单词前移
 sL[n], sL[i] = sL[i], sL[n]
 n++
 i++
 }
 }
 //翻转有效单词
 for i := 0; i < n/2; i++ {
 sL[i], sL[n-i-1] = sL[n-i-1], sL[i]
 }
 //返回由空格间隔的有效单词字符串
 return strings.Join(sL[:n], " ")
}

总结

熟练掌握golang的strings包自带函数

leetcode题解中还有一个双百的go解法,必须极其了解golang语言才能理解,所以再接再厉。

补充:Golang 翻转含有中文、数字、英文字母的字符串

rune表示:

package main

import "fmt"

func main() {

 src := "你好啊,XXX啊啊啊啊"
 dst := reverse([]rune(src))
 fmt.Println("result is:",string(dst))
}

func reverse(s []rune) []rune {
 for i,j :=0,len(s)-1;i<j;i,j = i+1,j-1{
 s[i],s[j] = s[j],s[i]
 }
 return s
}

结果如下:

byte表示:

package main

import "fmt"

func main() {

 src := "你好啊,XXX啊啊啊啊"
 dst := reverse([]byte(src))
 fmt.Println("result is:",string(dst))
}

func reverse(s []byte) []byte {
 for i,j :=0,len(s)-1;i<j;i,j = i+1,j-1{
 s[i],s[j] = s[j],s[i]
 }
 return s
}

结果如下,乱码了

总结:

rune(-2^31 ~ 2^31-1)是int32的别名,比起byte(-128~127),rune可表示的范围更大,所以能处理一切字符,当然也包括中文字符。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • golang 中获取字符串个数的方法

    在 golang 中不能直接用 len 函数来统计字符串长度,查看了下源码发现字符串是以 UTF-8 为格式存储的,说明 len 函数是取得包含 byte 的个数 // string is the set of all strings of 8-bit bytes, conventionally but not // necessarily representing UTF-8-encoded text. A string may be empty, but // not nil. Values

  • Golang中的Unicode与字符串示例详解

    背景: 在我们使用Golang进行开发过程中,总是绕不开对字符或字符串的处理,而在Golang语言中,对字符和字符串的处理方式可能和其他语言不太一样,比如Python或Java类的语言,本篇文章分享一些Golang语言下的Unicode和字符串编码. Go语言字符编码 注意: 在Golang语言中的标识符可以包含 " 任何Unicode编码可以标识的字母字符 ". 被转换的整数值应该可以代表一个有效的 Unicode 代码点,否则转换的结果就将会是 "�",即:一个

  • Golang中生成随机字符串并复制到粘贴板的方法

    前段时间在生活中偶尔需要对某些文件进行重命名,而且是随机名字,刚 开始是手动重命名然后在键盘上胡乱打一些字母数字,时间长了发现也挺麻烦的,于是想到能不能用golang实现这个功能并且自动把生成的字符串 复制到粘贴板,然后生成exe文件,要用的是直接鼠标双击就行.说干就干. 网上搜了些相关资料,于是写了出来. 安装必要的库 go get github.com/atotto/clipboard 代码实现 package main import ( "fmt" "github.co

  • golang时间字符串和时间戳转换的案例

    1. 获取当前时间字符串和时间戳 package main import ( "fmt" "time" ) func main() { now := time.Now().UTC() // 显示时间格式: UnixDate = "Mon Jan _2 15:04:05 MST 2006" fmt.Printf("%s\n", now.Format(time.UnixDate)) // 显示时间戳 fmt.Printf(&quo

  • golang 字符串拼接性能的对比分析

    背景 最近在做一个服务发现/注册的agent, 各个服务需要通过这个agent来注册自己的服务,在完成 开发后,测试性能时发现性能达不到要求,通过pprof 来确认cpu主要耗费在gc上,分析结果主要是由于字符串拼接导致,故需要测试一下字符串拼接的几种方法的性能: 字符串拼接的几种方法 1.直接使用加号进行拼接 2.strings.Join() 3.fmt.Sprintf() 4.bytes.Buffer 大量字符串拼接性能测试 我们使用的场景主要是大量字符串拼接,所以需要的场景是不断在字符串上

  • golang 字符串切片去重实例

    实现目的:实现字符串切片去重,只是两个字符完全相同时,去除一个. 实现方式:考虑两种,一种是常规的双重循环去除,另一种是利用map的key的唯一性实现. 1.通过双重循环来过滤重复元素 方法1, 思路:利用for双重循环,新建一个slice,遍历原slice中的每一个元素,每一次判断这个元素和后面元素是否相同,若相同则去除,若不同则存入新slice中,判断本元素后,再继续判断下一个元素,直到判断完毕. package main import "fmt" func main() { va

  • 利用golang的字符串解决leetcode翻转字符串里的单词

    题目 给定一个字符串,逐个翻转字符串中的每个单词. 示例 1: 输入: "the sky is blue" 输出: "blue is sky the" 示例 2: 输入: " hello world! " 输出: "world! hello" 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括. 示例 3: 输入: "a good example" 输出: "exampl

  • python3翻转字符串里的单词点的实现方法

    给定一个字符串,逐个翻转字符串中的每个单词. 说明: 无空格字符构成一个 单词 . 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括. 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个. 示例 1: 输入:"the sky is blue" 输出:"blue is sky the" 示例 2: 输入:" hello world! " 输出:"world! hello" 解释:输入字符串可以在前

  • C++实现LeetCode(151.翻转字符串中的单词)

    [LeetCode] 151.Reverse Words in a String 翻转字符串中的单词 Given an input string, reverse the string word by word. For example, Given s = "the sky is blue", return "blue is sky the". Update (2015-02-12): For C programmers: Try to solve it in-p

  • C++实现LeetCode(557.翻转字符串中的单词之三)

    [LeetCode] 557.Reverse Words in a String III 翻转字符串中的单词之三 Given a string, you need to reverse the order of characters in each word within a sentence while still preserving whitespace and initial word order. Example 1: Input: "Let's take LeetCode conte

  • C++实现LeetCode(186.翻转字符串中的单词之二)

    [LeetCode] 186. Reverse Words in a String II 翻转字符串中的单词之二 Given an input string , reverse the string word by word.  Example: Input:  ["t","h","e"," ","s","k","y"," ","i&qu

  • Swift算法实现逐字翻转字符串的方法示例

    前言 翻转字符串在字符串算法中算是比较常见的,而且被很多公司用作笔试题."逐字翻转字符串"是翻转字符串的翻版,也是之前Google的面试题,原题是这样的: Given an input string, reverse the string word by word. A word is defined as a sequence of non-space characters. The input string does not contain leading or trailing

  • 解决java 分割字符串成数组时,小圆点不能直接进行分割的问题

    问题描述: String preStr = "a.b.c"; // 这里要把该字符串按小圆点进行分割,成"a","b","c" String[] string = preStr.split("."); // 直接这样写是不行的 正确的写法是,对小圆点进行转义 String[] string = preStr.split("\\."); 补充知识:Java中不使用split方法实现字符串分

  • C语言左旋转字符串与翻转字符串中单词顺序的方法

    左旋转字符串 题目: 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部. 如把字符串 abcdef  左旋转 2  位得到字符串 cdefab.请实现字符串左旋转的函数. 要求时间对长度为 n  的字符串操作的复杂度为 O(n),辅助内存为 O(1). 分析: 网上看到解法很多种,就不详细说明了. 我采用的是数组不对称的交换时间复杂度应该是O(n). 代码实现(GCC编译通过): #include "stdio.h" #include "stdlib.h&q

  • 解决Python中字符串和数字拼接报错的方法

    前言 众所周知Python不像JS或者PHP这种弱类型语言里在字符串连接时会自动转换类型,如果直接将字符串和数字拼接会直接报错. 如以下的代码: # coding=utf8 str = '你的分数是:' num = 82 text = str+num+'分 | 琼台博客' print text 执行结果 直接报错:TypeError: cannot concatenate 'str' and 'int' objects 解决这个方法只有提前把num转换为字符串类型,可以使用bytes函数把int

  • 解决python文件字符串转列表时遇到空行的问题

    文件内容如下: Alex 100000 Rain 80000 Egon 50000 Yuan 30000 #此处有一个空行! 现在看如何处理并转成列表! salary_info = open("salaryinfo.txt", "r+", encoding="UTF-8") salary_info_list = [] for line in salary_info.readlines(): if line == '\n': pass else:

随机推荐