leetcode--字符串循环左移

来源:互联网 发布:网络专线多少钱一年 编辑:程序博客网 时间:2024/06/08 10:00
// convert_test.cpp : 定义控制台应用程序的入口点。//字符串循环左移问题#include "stdafx.h"#include<iostream>using namespace std;//   问题:给定一个字符串S[0...N-1],要求把S的前K个字符移动到S的尾部,比如字符串"abcdef",//前面两个字符 'a' 'b'移动到字符串的尾部,得到新字符串"cdefab",即字符串循环左移K。//注:循环左移k位和循环右移n-k位效果一致。//要求:时间复杂度O(n),空间复杂度O(1).void ReverseString(char* s, int from, int to){    while (from < to)    {        char t = s[from];        s[from++] = s[to];        s[to--] = t;    }}void LeftRotateString(char* s, int n, int m){   //n为字符串长度,m为循环左移个数    m %= n; //注:循环左移n+k位和k位的效果相同,因为比如一个字符串长度为6,循环左移8位,结果和循环左移2位一致    ReverseString(s, 0, m - 1); //第一次copy,S[0...k]--T[0...k]    ReverseString(s, m, n - 1);//第二次copy,S[k+1...N-1]--S[0...N-k-1]    ReverseString(s, 0, n - 1);//第三次copy,T[0...k]--S[N-k...N]}int _tmain(int argc, _TCHAR* argv[]){    //顺便解释main中两个行参的意思,argc=argument count,argv=argumen value。    //char* argv[]是一个指针数组,这个数组的元素都是指针,argv[0]表示指向一个元素,*argv[0]表示取第一个元素。    //作用是命令行参数,例如命令行为 copy frompath to,由三个字符串组成,则int argv=3,* argv[0]代表"copy"这个字符串    char* s= "abcdef";    int n = 6;    int m = 2;    LeftRotateString(s, n, m);    return 0;}
0 0
原创粉丝点击