前言
翻转字符串在字符串算法中算是比较常见的,而且被很多公司用作笔试题。”逐字翻转字符串”是翻转字符串的翻版,也是之前Google的面试题,原题是这样的:
Given an input string, reverse the string word by word. A word is defined as a sequence of non-space characters. The input string does not contain leading or trailing spaces and the words are always separated by a single space. For example, Given s = "the sky is blue", return "blue is sky the". Could you do it in-place without allocating extra space?
简而言之就是:”the sky is blue”—>”blue is sky the”
所以,对于本文,要解决的算法是:
逐字翻转字符串,例如:"the sky is blue"—>"blue is sky the"
接下来看下实现思路和代码。
实现思路及代码
既然是字符串翻转的翻版,我们就可以利用之前翻版字符串的思路去解决就可以了,不过这道题要有两次翻转:
第一次翻转,整体翻转:”the sky is blue” -> “eulb si yks eht”
第二次翻转,单词翻转:”eulb si yks eht” -> “blue is sky the”
所以,首先可以实现一个可以翻转局部和全部字符串的算法,传入字符数组、startIndex 和 endIndex ,其中 startIndex 和 endIndex 分别为要翻转的字符串的起始下标和结束下标,也就是要翻转 startIndex 和 endIndex 之间(包含)的字符,代码如下:
func _reverseStr( _ chars:inout [Character], _ startIndex:Int, _ endIndex:Int){ var startIndex = startIndex var endIndex = endIndex if startIndex <= endIndex { let tempChar = chars[endIndex] chars[endIndex] = chars[startIndex] chars[startIndex] = tempChar startIndex += 1 endIndex -= 1 _reverseStr(&chars,startIndex,endIndex) } }
之后就可以利用上面的算法去完成前面说的两次翻转:
func reverseWords(_ str:String) -> String{ var chars = [Character](str.characters) //首先翻转整个字符串所有字符,"the sky is blue" -> "eulb si yks eht" _reverseStr(&chars,0,chars.count-1) //然后翻转每个单词中的字符,"eulb si yks eht" -> "blue is sky the" var startIndex = 0 for endIndex in 0 ..< chars.count { if endIndex == chars.count - 1 || chars[endIndex + 1] == " " { _reverseStr(&chars, startIndex, endIndex) startIndex = endIndex + 2 } } return String(chars) }
完整算法代码:
//翻转指定范围的字符 func _reverseStr( _ chars:inout [Character], _ startIndex:Int, _ endIndex:Int){ var startIndex = startIndex var endIndex = endIndex if startIndex <= endIndex { let tempChar = chars[endIndex] chars[endIndex] = chars[startIndex] chars[startIndex] = tempChar startIndex += 1 endIndex -= 1 _reverseStr(&chars,startIndex,endIndex) } } //逐字翻转字符串 func reverseWords(_ str:String) -> String{ var chars = [Character](str.characters) //首先翻转整个字符串所有字符,"the sky is blue" -> "eulb si yks eht" _reverseStr(&chars,0,chars.count-1) //然后翻转每个单词中的字符,"eulb si yks eht" -> "blue is sky the" var startIndex = 0 for endIndex in 0 ..< chars.count { if endIndex == chars.count - 1 || chars[endIndex + 1] == " " { _reverseStr(&chars, startIndex, endIndex) startIndex = endIndex + 2 } } return String(chars) } reverseWords("the sky is blue") //return "blue is sky the"
总结
以上就是关于Swift算法实现逐字翻转字符串的方法,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。
本文向大家介绍Swift算法实现字符串转数字的方法示例,包括了Swift算法实现字符串转数字的方法示例的使用技巧和注意事项,需要的朋友参考一下 前言 最近学完Swift之后一直没有机会实战,发现由于Swift发展历史原因,目前网上大部分的算法都是使用C、Java或其他语言实现的,几乎没有使用Swift实现的,所以自己打算使用Swift去实现一些主流的算法,既是对自己Swift的回顾,也是对自己算法
本文向大家介绍php实现字符串翻转的方法,包括了php实现字符串翻转的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php实现字符串翻转的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的php程序设计有所帮助。
本文向大家介绍php中实现字符串翻转的方法,包括了php中实现字符串翻转的方法的使用技巧和注意事项,需要的朋友参考一下 字符串:$str = "abcdefg"; 方法一(直接使用php自带函数strrev($str)) print_r(strrev($str)); 使用for循环方式,str_split($str) 使用for循环方式,strlen($substr) 使用for循环方式,strl
本文向大家介绍php简单实现多字节字符串翻转的方法,包括了php简单实现多字节字符串翻转的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php简单实现多字节字符串翻转的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的php程序设计有所帮助。
本文向大家介绍PHP实现字符串翻转功能的方法【递归与循环算法】,包括了PHP实现字符串翻转功能的方法【递归与循环算法】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现字符串翻转功能的方法。分享给大家供大家参考,具体如下: 提到实现字符串反转的方法,大家都会想到用循环。确实,循环是一个内存占用量小且实现简单的方式。但是还有一种方式可以实现这样的功能,那就是递归。 php支持递归函数
本文向大家介绍javascript实现字符串反转的方法,包括了javascript实现字符串反转的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript实现字符串反转的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的javascript程序设计有所帮助。