专栏首页陌无崖知识分享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 条评论
登录 后参与评论

相关文章

  • Go寻找最长回文字符串——中心扩展法

    对于一个回文字符串,我们可以很轻易的找到其中的规律就是首尾逐个字符进行遍历是相同的字符因此我们可以定义两个指针指向首和尾,进行遍历比较,如果遇见不相同的则返回f...

    陌无崖
  • Go实现字符串全排列字典序排列详解

    在数学中,字典或词典顺序(也称为词汇顺序,字典顺序,字母顺序或词典顺序)是基于字母顺序排列的单词按字母顺序排列的方法

    陌无崖
  • 微服务系列笔记之Mico Api详解

    上一篇文章中有了入门案例,现在是不是有了很好的理解,不过有个前提是你需要了解grpc技术,简单的来说grpc是一个通信框架,micro是类似的一个通信框架,只不...

    陌无崖
  • Python的字符串方法

    s.isdigit() -> bool  Return True if all characters in S are digits

    py3study
  • python学习笔记字符串(二)

    请注意,''或""本身只是一种表示方式,不是字符串的一部分,因此,字符串'abc'只有a,b,c这3个字符。如果'本身也是一个字符,那就可以用""括起来,比如"...

    py3study
  • Linux下Socket编程(五)——http容器(支持php)简介

    为了方便操作以及功能模块的拆分,这里我们将请求内容和响应内容进行封装。这里我们只列出头文件,封装类中我们仅仅做了关系字段的提取。

    用户2929716
  • TypeScript 非空断言

    使用这种方案,问题是解决了。但有没有更简单的方式呢?答案是有的,就是使用 TypeScript 2.0 提供的非空断言操作符:

    阿宝哥
  • WCF Data Service 的.NET Client 的不支持原生类型服务操作的解决方法

    WCF Data Service  的.NET Client 的不支持返回值为原生类型(string,int)的服务操作调用,例如我们用如下服务操作: [Web...

    张善友
  • C++之旅-string

    标准库类型string表示可变长字符序列,使用之前需要包含string头文件,它定义在命名空间std中。

    编程珠玑
  • 合理利用延迟初始化优化 Spring Boot

    随着我们项目的不断迭代 Bean 的数量会大大增加,如果都在启动时进行初始化会非常耗时。Spring Boot 允许延迟初始化应用程序, 也就是根据需要初始化 ...

    码农小胖哥

扫码关注云+社区

领取腾讯云代金券