O(1)表示 不管字符串有多长, 反向用的临时空间保持不变。
void Main() { string input = "sports.sina.com.cn"; char[] array = input.ToCharArray(); string output = ReversePartial(input.ToCharArray(), '.'); Console.WriteLine(output); } string ReversePartial(char[] input, char seperator) { Reverse(ref input, 0, input.Length - 1); char tmp = new char(); int head, tail; head = tail = 0; for(int i = tail; i < input.Length; i++) { if (input[i] == seperator) { tail = i - 1; if (head < tail) { Reverse(ref input, head, tail); head = i + 1; } } } if (head > tail && head < input.Length) Reverse(ref input, head, input.Length - 1); return new string(input); } void Reverse (ref char[] input, int startIndex, int endIndex) { char tmp = new char(); for(int i = 0; i <= (endIndex - startIndex) / 2; i++) { tmp = input[startIndex + i]; input[startIndex + i] = input[endIndex -i]; input[endIndex -i] = tmp; } }
所谓空间复杂度,是指在算法运行期间,临时占用的存储空间的量度。所以我们只需要一个临时空间来交换所有的字符串。
思路:倒序取,然后组合。将字符串以.作为分隔标记
关注一下
非常简单,先对整个字符串做 strrev ,很显然,空间是 O(1),时间是 O(n)
接着对每个单词做 strrev,同样显然,空间依然是 O(1),时间是 O(n)。
综合以上,就是答案。
提示:两个字符指针即可,char* pStartPos, *pEndPos;
思路已足够,代码太简单,不给你具体代码了。