• [剑指Offer] 43.左旋转字符串


    题目描述

    汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!

    【思路1】将第一个字符移到最后面,执行n次,时间复杂度为O(m*n)。

     1 class Solution {
     2 public:
     3     string LeftRotateString(string str, int n) {
     4         if(str.length() <= n)
     5             return str;
     6         for(int i = 0;i < n;i ++){
     7                char c = str[0];
     8             for(int j = 0;j < str.length() - 1;j ++)
     9                 str[j] = str[j + 1];
    10             str[str.length() - 1] = c;
    11         }
    12         return str;
    13     }
    14 };

    【思路2】使用STL中的reverse()函数,时间复杂度O(n)。

    假设原序列有n位,循环左移i位的过程如下:

    (1)reverse(0,i-1); (2)reverse(i,n-1); (3)reverse(1,n-1);

    例如原序列:abcdefg,循环左移3位:(1) cba defg  (2)cba gfed  (3) defgabc
    代码就非常简单了,而且reverse操作非常简单,效率高也不容易出错,要记住一点就是STL中的迭代器是左闭右开区间,所以reverse操作的第二个参数需要往后移动一位。
     1 class Solution {
     2 public:
     3     string LeftRotateString(string str, int n) {
     4         if(str.length() <= n)    return str;
     5         reverse(str.begin(),str.begin() + n);
     6         reverse(str.begin() + n,str.end());
     7         reverse(str.begin(),str.end());
     8         return str;
     9     }
    10 };

    【思路3】使用substr()函数。

    注:str.substr(pos, n)返回一个字符串,包含s中从下标pos开始的n个字符。

     1 class Solution {
     2 public:
     3     string LeftRotateString(string str, int n) {
     4         int len = str.length();
     5         if(len <= n) return str;
     6         n %= len;
     7         str += str;
     8         return str.substr(n,len);
     9     }
    10 };
  • 相关阅读:
    23种设计模式
    (C# 基础) 接口
    (C#) Handling and Raising Events
    (C# 基础) 位运算
    (C#) 线程之 AutoResetEvent, EventHandle.
    (C#) 线程基础
    div在固定高的文字垂直居中
    滚动置顶
    jQuery给同一个元素两个点击事件
    (置顶)js实现超过页面一屏后,点击图标滚动到页面顶部top
  • 原文地址:https://www.cnblogs.com/lca1826/p/6525138.html
Copyright © 2020-2023  润新知