字符串反转之——手摇算法

手摇算法(也叫三次反转算法)

看题:将字符串abcdefg,变成efgabcd,要求空间复杂度O(1)。

解答:

  • 第一步:将子串abcd反转,变成dcba。源字符串变成dcbaefg
  • 第二步:将字串efg反转,变成gfe。源字符串变成dcbagfe
  • 第三步:将整个字符串dcbagfe反转,变成efgabcd。

手摇算法常常被用来旋转字符串。同时,手摇算法也可以用来做原地归并排序,实现空间O(1).

核心代码:

void shiftBlocks(int arr[], int start, int pos, int end)
{
	reverse(arr,start,pos-1);
	reverse(arr,pos,end);
	reverse(arr,start,end);
}

void reverse(int arr[], int start, int end)
{
	for(int i=start, j=end; i<j; i++,j--)
	{
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
}
时间: 2024-11-03 22:21:12

字符串反转之——手摇算法的相关文章

poj 3617 Best Cow Line (字符串反转贪心算法)

Best Cow Line Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9284   Accepted: 2826 Description FJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annual"Farmer of the Year" competition. In this contest every farmer arranges his

趣味算法:字符串反转的N种方法(转)

老赵在反对北大青鸟的随笔中提到了数组反转.这的确是一道非常基础的算法题,然而也是一道很不平常的算法题(也许所有的算法深究下去都会很不平常).因为我写着写着,就写出来8种方法……现在我们以字符串的反转为例,来介绍这几种方法并对它们的性能进行比较. 使用Array.Reverse方法 对于字符串反转,我们可以使用.NET类库自带的Array.Reverse方法 public static string ReverseByArray(this string original) { char[] c =

手摇算法

如何实现字符串倒置呢,直接用头尾两个指针从两边向中间扫,并且不断交换两个指针的内容, void reverse(int a[], int n){ if(n < 2) return; for(int i = 0; i <= n;) swap(a[i++], a[--n]); } 然后,如果要实现字符串反转呢,比如,有字符串abcdefg,假设要将前n个字符与剩下的字符串交换位置,比如n=3,则字符串变为defgabc. 这里就要用到手摇算法了,手摇算法是指用三次倒置来实现字符串反转. 对于 ab

JS 对 字符串反转

突然看到比较好的文章,列举了挺多比较好的方法,再次我也举一反三,写出一段代码. var str = "123456"; function reverseStr(s){ return s&&reverseStr(s.slice(1)) + s[0]; } alert(reverseStr(str)); 原文章:JavaScript算法练习:字符串反转

关于字符串反转的几种方法的比较

下面先上代码: class Program { static void Main(string[] args) { string str = "12345"; const int count = 10000; Stopwatch sw = Stopwatch.StartNew(); for (int i = 0; i < count; i++) { Reverse1(str); } Console.WriteLine("Reverse1耗时: {0}", sw

[C/C++] String Reverse 字符串 反转

#include <iostream> #include <string> #include <algorithm> #include <cstring> inline void STL_Reverse(std::string& str) // 反转string字符串 包装STL的reverse() 可以inline { reverse(str.begin(), str.end()); // STL 反转函数 reverse() 的实现 /* tem

Java面试题从零开始:写一个函数把字符串反转

前言:为了能够找一个代表我从零开始的诗词,我挖空心思去找,然而怎么也找不到一个贴合我心意的,被迫上了度娘也不曾找到.真想把小学一年级的语文课本拿出来好好的通读一遍,肯定能找到答案. 好了,既然找不到也不必耿耿于怀了.今天读了<高效能程序员的修炼>第四章,发现自己好烂,如果按照作者的看法,我是无论如何都入不了他的法眼,于是乎,我告诉自己,从零开始,把作者提出的面试题按照Java来写一遍,无论是参考别人还是自己略能想得到的办法,亲自动手把它们敲出来,并且记录下来吧! 写一个函数把字符串反转,作为本

字符串反转方法汇总

split()方法将一个字符串对象的每个字符拆出来,并且将每个字符串当成数组的每个元素 reverse()方法用来改变数组,将数组中的元素倒个序排列,第一个数组元素成为最后一个,最后一个变成第一个 join()方法将数组中的所有元素边接成一个字符串 来看个实例: 1 function reverseString(str) { 2 // 第一步,使用split()方法,返回一个新数组 3 // var splitString = "hello".split("");

字符串反转的进一步应用----单词反转

字符串反转:如给定一字符串 good bye boy. 反转之后: .yob eyb doog 实现思路: 分别从第一个字符和最后一个字符,同时向中间遍历,交换遇到的每一个字符.JAVA实现代码如下:字符数组str存储待反转的字符串. private static void inverse(char[] str, int start, int end){ int i = start; int j = end; while(i < j){ char tmp = str[i]; str[i] = s