作者 | 陌无崖
导语
大三上学期即将结束,按照自己的计划,大三下学期就要在网上投简历找工作了。还是有点忐忑的,接下来的日子准备沉淀沉淀自己的知识,尤其是数据结构和算法,因此我在图书馆借了两本名叫《编程之法》和《进军硅谷程序员面试揭秘》的书,打算用作我的学习。决定以后抽时间将书上的内容尽可能的吃透。公众号也随之更新我的心得和笔记。练习的代码会同步托管的到码云上,可以公众号回复码云获取我的仓库,觉得还行的话,麻烦大家点个星,在我面试的时候,希望可以拿这当作我的一个亮点,提前谢谢大家了。
字符串反转问题
随机给出一个字符串,要求对前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”,标点符号和普通字母一样处理即可。
此题的答案可以在我的仓库中找到。