专栏首页陌无崖知识分享Go 字符串反转问题解决思路

Go 字符串反转问题解决思路

作者 | 陌无崖

转载请联系授权

导语

大三上学期即将结束,按照自己的计划,大三下学期就要在网上投简历找工作了。还是有点忐忑的,接下来的日子准备沉淀沉淀自己的知识,尤其是数据结构和算法,因此我在图书馆借了两本名叫《编程之法》和《进军硅谷程序员面试揭秘》的书,打算用作我的学习。决定以后抽时间将书上的内容尽可能的吃透。公众号也随之更新我的心得和笔记。练习的代码会同步托管的到码云上,可以公众号回复码云获取我的仓库,觉得还行的话,麻烦大家点个星,在我面试的时候,希望可以拿这当作我的一个亮点,提前谢谢大家了。

字符串反转问题

随机给出一个字符串,要求对前m个字符放到原来字符串的尾部。

解题方法一:蛮力移位

1、定义指向该字符串的指针 str

2、字符串的长度为n

3、编写函数,功能为每次将我们的字符串的第一个字符移动到最后

若要使字符串前m个字符移动到后面,则只需调用函数m

func LeftShiftOne(str *string, n int) {
  // 保存第一个字符
  // 将字符传存放到rune数组
  // string转换成rune
  strs := []rune(*str)
  // 存放第一个字符
  f := strs[0]
  *str = ""
  // 循环数组
  for i := 1; i < n; i++ {
    strs[i-1] = strs[i]
  }
  strs[n-1] = f

  *str += string(strs[n-1])
  *str = string(strs)
}

这里需要大家数量掌握Go语言中关于string和rune的用法

//string 转[]byte
b := []byte(str)

//[]byte转string
str = string(b)

//string 转 rune
r := []rune(str)

//rune 转 string
str = string(r)

解题方法二:三步反转

对于题目的要求我们可以换个角度,我们可以将字符串前面的部分原封不动的移动到字符串的尾部,那么是否可以把需要移动的部分和不需要移动的部分分成两个部分,因此我们可以对分成两部分的字符串进行各自的反转组合成新的字符串,然后再对新的字符串进行反转。

首先我们需要编写一个函数来实现字符串的反转

func ReverseStringOne(str *string, from int, to int) {
  ru := []rune(*str)
  for from < to {
    c := ru[from]
    ru[from] = ru[to]
    from += 1
    ru[to] = c
    to -= 1
  }
  *str = string(ru)
}

接着我们就可以对我们的字符串进行三个步骤的反转,我们为了更加简单,保持原有的字符串不变的传入,我们只需要对该字符串进行部分反转,前后各反转和最终反转如下

func LeftShiftOne(str *string, n int, m int) {
  // 将字符串根据要求进行反转为两个部分
  ReverseStringOne(str, 0, m-1)
  ReverseStringOne(str, m, n-1)
  ReverseStringOne(str, 0, n-1)
}

举一反三

输入一个英文句子,反转句子中单词的顺序,要求单词中的顺序不变,如“I am a student.” 最终输出 “student. a am I”,标点符号和普通字母一样处理即可。

此题的答案可以在我的仓库中找到。

本文分享自微信公众号 - golang技术杂文(gh_ebbdb61f463e),作者:无崖子天下无敌

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 字符串反转问题

    首先是我之前写的程序,同时这也是处理第一类的字符串反转问题,也就是输入This is a string., 输出为.gnirts a si sihT: #inc...

    猿人谷
  • 图解LeetCode第 344 号问题:反转字符串

    输入: "A man, a plan, a canal: Panama" 输出: "amanaP :lanac a ,nalp a ,nam A"

    五分钟学算法
  • Go语言整数值转字符串的效率问题

    测试结果如下。首先执行文件必须是 *_test.go 后缀的文件,然后通过 go test 来运行。从下面的结果可以看出,fmt.Sprintf 效率是最低的。

    runzhliu
  • PHP中文字符串反转编码错误解决方式

    在使用PHP处理字符串反转的时候,我们第一反应是使用PHP的内置函数strrev来处理,思维上是没有问题的,但是我们需要知道一个问题,函数strrev是否可以处...

    小白程序猿
  • PHP中文字符串反转编码错误解决方式

    在使用PHP处理字符串反转的时候,我们第一反应是使用PHP的内置函数strrev来处理,思维上是没有问题的,但是我们需要知道一个问题,函数strrev是否可以处...

    小白程序猿
  • Go语言相关练习_选择题(2)

    go语言中字符串是UTF-8编码并存储的,它语言不定长的字节,所以它不支持下标操作,因为没一个下标操作代表的是固定长度的字节,所以不能对字符串中某个字符单独赋值...

    Zoctopus
  • Go 回答之如何阅读 Go 源码

    Go 的源码在安装包的 src/ 目录下。怎么看它的源码呢?直接看吧!没人教的情况下,只能自己撸了。当然,这种内容一般也不会有人教。

    波罗学
  • 图解精选 TOP 面试题 003 | LeetCode 344. 反转字符串

    编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

    江不知
  • 用PHP解决一个有趣的字符串问题

    "a;with( rath ):solve;with(( raeem );with(autoBT);bbb";

    Enjoy233
  • LeetCode-题库-刷题(6-7)

    将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 具体题目链接

    布衣者
  • 从这道字符串处理的难题,寻找解决复杂问题的套路

    今天是LeetCode专题的第39篇文章,我们一起来看下LeetCode第68题 Text Justification。

    TechFlow-承志
  • 实现一些字符串操作标准库函数、解决一些字符串问题

    一、实现字符串操作标准库函数 (1)、strcpy、strncpy、memmove、memcpy、memset、strlen、strncat 的实现 C++ C...

    s1mba
  • [Go]实现GO语言中的base64_decode 解决非法字符问题

    在使用标准库的base64 decode时会出现非法字符的错误 , 下面这个函数是我测试可以正常解密的

    陶士涵
  • Oracle 聚合函数解决聚集连接字符串问题

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1148526
  • 解决Django中set_cookie()不能存储中文字符串问题

    用json模块完全可以解决以上问题: import json json.dumps(username):把字符串username转换为python程序可识别...

    kirin
  • 【Go】高效截取字符串的一些思考

    最近我在 Go Forum 中发现了 [SOLVED] String size of 20 character 的问题,“hollowaykeanho” 给出了...

    thinkeridea
  • 『Go 语言学习专栏』-- 第十三期

    谢伟
  • [labuladong算法小抄]如何判断回文链表

    因为回文串长度可能为奇数也可能是偶数,长度为奇数时只存在一个中心点,而长度为偶数时存在两个中心点,所以上面这个函数需要传入l和r。

    陶士涵
  • 9. Go复合类型-数组

    前面我们已经学习了一些简单的基本类型,现在学习复合类型,复合类型主要包括了数组,指针,切片,结构体等。现在先来学习数组.

    Devops海洋的渔夫

扫码关注云+社区

领取腾讯云代金券