打基础时,不要太沉迷于库函数。
题目:344. 反转字符串
创建一个用于反转输入字符串的函数。 输入字符串以字符数组char[]的形式给出。请勿为其他数组分配额外的空间。 必须当场修改输入数组,使用o(1)的多余空间解决这个问题。
可以假设数组中的所有字符都是ASCII代码表中的可打印字符。
示例1 :
输入: h、e、l、l、o。 输出: o、l、e和h。 示例2 :
输入: h、a、n、n、a、h输出: h、a、n、n、a、h
思路
我先说句题外话:关于这个主题,一些同学直接使用c的库函数reverse,调整后很快就结束了。 我相信每个编程语言都有这样的库函数。
这样解决问题的话,反转字符串的实现原理就不太明白了。
但是,并不是不能使用库函数,而是根据场景不同而不同。
在现场面试中,我们什么时候使用库函数,什么时候不使用库函数呢?
“如果主题的重要部分可以直接用库函数解决,则建议不要使用库函数。 “”
毕竟面试官不是考察你对库函数的熟练度,如果是使用python和java的学生的话就需要更加注意。 因为,python、java提供了丰富的库函数。
“如果库函数只是解题过程的一部分,并且对该库函数的内部实现原理很了解的话,也可以考虑使用库函数。 “”
平时用leet代码练习算法时,建议根据这样的原则进行练习。 这样有助于理解算法。
不要沉迷于使用库函数通过单行代码解决问题等技巧。 不是说这些技巧不好,而是说可以用来娱乐。
真正自己写作的时候,要保证能实现理解是相应的功能。
下面介绍如何解决反转字符串问题。
大家应该也记得。 我们已经谈了206 .逆转链接列表的事。
使用了双指针方法来反转链表。
虽然反转字符串仍然是使用双指针的方法,但是反转字符串比链表更简单。
由于字符串也是数组,元素在内存中连续分布,这决定了反转链表的方法和反转字符串的方法不同。
如果学生不知道数组和链表的原理,可以看到这两者。 关于链表,你应该知道这些。 必须掌握排列理论的知识。
对于字符串,定义两个指针(也可以称为索引下的表),一个从字符串前面移动,另一个从字符串后面移动,两个指针同时移动到中间以交换元素。
以字符串hello为例,过程如下。
写下这样的c代码:并不难
voidreversestring (向量符号) {
for(inti=0,j=s.size ) )-1; is.size ()/2; I,j---- ) {
swap (西班牙语,西班牙语);
}
}
在循环中进行s[i]和s[j]的交换操作就可以了,但是在这里使用了叫做swap的库函数。 大家都可以用。
我想您知道交换函数是如何实现的,而且这个库函数只是解题中的一部分,所以在这里使用库函数也可以。
swap有两个实现。
一个是常见的交换数值:
int tmp=秒;
s=s;
s[j]=tmp;
一个是由位运算引起的
s ^=s;
^=秒;
s ^=s;
这个题目还很简单,但我正好可以通过这个题目说出刷题时使用库函数的原则。
如果主题的重要部分可以直接用库函数解决,建议不要使用库函数。
如果库函数只是解决问题的一小部分,并且您很清楚该库函数的内部实现原理,则可以考虑使用库函数。
基于这样的原则,我不使用reverse库函数,而是使用swap库函数。
“在字符串相关主题方面,库函数对大家的吸引力非常大。 因为有各种各样的反转,切取单词的操作”。 这就是为什么字符串库函数这么丰富的原因。
我相信大家根据我叙述的原则做字符串相关的主题,在选择库函数方面是有原则的,是可以得到的。
在留言区留下你的想法吧!
--------- -结束-------
关于算法学习的资料总结在github:https://github.com/young yangyang 04/leet代码- master中。 其中还有leet代码刷题攻略、各类型经典主题刷题顺序、思维导图。 看看就一定会得到。
每天8:35小时推送经典算法主题,推送的所有主题不是孤立的,而是浅而深、圈、梳理算法知识脉络,轻松学习算法!
《@代码随想录》期待着你的关注!