今天遇到一道题目是实现一个反转字符串的函数,具体如下:

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

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:

输入:["h","e","l","l","o"]输出:["o","l","l","e","h"]

示例 2:

输入:["H","a","n","n","a","h"]输出:["h","a","n","n","a","H"]

自己动手操作了一下,大概有如下几种方式

方法1

如果不考虑题目中所说的“原地修改输入数组”,可以借助一个中间列表来实现

从列表的尾部向前遍历,可以通过如下2种方式定义索引

def reverseString_1(self, s):        """        思路:借助一个中间变量temp,然后从s的尾部提取,把元素追加到temp中        :param s:        :return:        """        temp = []        for i in range(len(s)):            temp.append(s[len(s)-1-i])        return temp    def reverseString_2(self, s):        """        思路:和方法4一样,不过换个实现方式(和第8题方法2用到的倒序循环一样)        :param s:        :return:        """        temp = []        for i in range(len(s)-1, -1, -1): # range中的表示索引范围,len(s)-1表示遍历的第一个元素(也就是从最后一个元素开始遍历);            # 第一个-1表示最后一个位置,不过由于遍历范围右边不闭合,所以这里其实最终遍历的是第一个元素;            # 第二个-1表示步长,每次-1,即从后往前遍历            temp.append(s[i])        return temp

方法2

思考一下:

反转字符串其实可以转换为“首尾元素串互换”,如:第1位和倒数第1位互换、第2位和倒数第2位互换、第3位和倒数第3位互换

[1,2,3,4,5,6][6,5,4,3,2,1]

这样的话,可以定义2个指针,一个从首位遍历往后遍历,一个从末尾往前遍历;
然后每次遍历都交换2个位置的元素,一直遍历到中间元素;

'''遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!'''def reverseString(self, s):        """        :type s: List[str]        :rtype: None Do not return anything, modify s in-place instead.        """        i = 0  # 第一个指针,从首部遍历        j = len(s) - 1  # 第二个指针,从尾部遍历        while j > i: # 如果j>i就一直循环,直到2个指针相遇            s[i], s[j] = s[j], s[i]  # 交换2个位置的元素            i += 1            j -= 1        return s

方法3

这个方法比较绕,而且在提交时,由于超时导致并未通过(系统给出的数组太长导致),不过自己测试时给了几个数组,也能正常倒序输出

思路如下:既然是倒序输出,可以把第1个和第2个元素互换,然后第2个和第3个互换......直到把第1个元素挪到了最后的位置;

但是此时还未结束,这只是把第1个元素挪到了最后,还需要重复上述步骤,再把原先的第2个元素(现在的第1个元素)挪到倒数第2个位置(注意:此时的最后一个元素不能动)

按照上述步骤,把所有元素都挪动一遍,就完成了

def reverseString(self, s):        """        思路:        :type s: List[str]        :rtype: None Do not return anything, modify s in-place instead.        """        n = 0        while n < len(s):            i = 0            for j in range(1, len(s)-n):                s[i], s[j] = s[j], s[i]                i += 1            n += 1        return s

方法4

利用切片来实现倒序输出

'''遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!'''def reverseString(self, s):        """        思路:切片        s[::-1]表示反转s中的元素        s[:]表示数组中所有子模块        s[:]=s[::-1]表示将原数组反转后赋值给s中每一个对应的位置        s=s[::-1]表示将s反转后赋值给新的对象s,与题意原地修改不符        :param s:        :return:        """        s[:] = s[::-1]        return s

方法5

使用reverse()方法,它会对原列表进行反向排序(注意:reverse只对list有效)

def reverseString_6(self, s):        """        :param s:        :return:        """        s.reverse()        return s

不过reverse()方法的源码,会发现它其实就是利用的切片,如下

©著作权归作者所有:来自51CTO博客作者Python热爱者的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. web前端入门到实战:css重点知识和bug解决方法
  2. web前端中涉及的回流和重绘详解!
  3. 前端inline元素间隙问题解决办法
  4. 图解 Java 中的数据结构及原理,不懂的也能看清楚
  5. 一文讲解回流和重绘
  6. 【归纳】速来看img图片之间的空白间隙的6种有效解决方案
  7. 【归纳】赶紧收藏css实现水平垂直居中的八种快速方法总结
  8. 0323作业-css基础知识3
  9. Playwright自动化测试工具之元素定位实战

随机推荐

  1. Android原生(Native)C开发之一(备份测试
  2. android 程序发布
  3. Android美工坊--底部菜单栏实现
  4. Android使用SharedPreferences保存List列
  5. Android(安卓)CTS 结果 testResult.xml
  6. Android(安卓)Cupcake源码编译笔记
  7. android ViewPager页面左右滑动切换
  8. 自定义Android组件之带图像的TextView
  9. 自定义一个自己的Log
  10. linux kernel suspend Resume