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”,标点符号和普通字母一样处理即可。
此题的答案可以在我的仓库中找到。
- 简单易学的机器学习算法——线性支持向量机
- Java设计模式-模板方式模式
- 由一条create语句的问题对比mysql和oracle中的date差别 (r7笔记第26天)
- Java设计模式-命令模式
- 关于执行计划中的%CPU的含义 (r7笔记第25天)
- Java设计模式-享元模式
- 简单易学的机器学习算法——线性可分支持向量机
- 基于gensim的Doc2Vec简析,以及用python 实现简要代码
- 关于db link权限分配的苦旅(一) (r7笔记第42天)
- Java设计模式-责任链模式
- Java设计模式-策略模式
- CPU 100%负载的性能优化分析(r7笔记第40天)
- Sklearn-train_test_split随机划分训练集和测试集
- 使用shell来定制dbms_sqltune(r7笔记第39天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 基于python实现音乐播放器代码实例
- PHP实现微信对账单处理
- Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
- PHP Include文件实例讲解
- ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
- Python Switch Case三种实现方法代码实例
- PHP正则表达式笔记与实例详解
- php实现微信分享朋友链接功能
- python交互模式基础知识点学习
- 浅析Python 抽象工厂模式的优缺点
- 基于PyTorch的permute和reshape/view的区别介绍
- Laravel配置全局公共函数的方法步骤
- PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
- python–shutil移动文件到另一个路径的操作
- PHP正则表达式处理函数(PCRE 函数)实例小结