首页 > 其他分享 >剑指offer 58 2 左旋转字符串

剑指offer 58 2 左旋转字符串

时间:2023-05-31 19:12:29浏览次数:30  
标签:count 58 offer int 复杂度 字符串 public string

将左边n个字符转移到字符串结尾,比如 s=abcdefg ,n=2;输出cdefgab。看起来不难,但是解法还是挺多的,重要的是复杂度。

还是先写下思路,

常规的思路(暴力):就是定义两个字符串str1,str2,n之后的字符全部拷贝进入str2,然后再把k和k之前字符的拷贝进入str1,返回str2+str1。 缺点嘛,空间复杂度高,时间复杂度也就O(N),代码如下。

class Solution {
public:
    string reverseLeftWords(string s, int n) {
    string str1,str2;

for(int i=0;i<n;i++)
{
    str1+=s[i];
}

for(int i=n;i<s.size();i++)
{
    str2+=s[i];
}

return str2+str1;
    }
};

 

那就稍微降低一下空间复杂度:就定义一个字符串,把n和n之前的字符拷贝进去,原本的字符串从n位置开始向前移动n个位置,然后重置s的大小,返回s+str,感觉并没有降低多少空间复杂度.....代码如下

class Solution {
public:
    string reverseLeftWords(string s, int n) {
string str;
for(int i=0;i<n;i++)
{
    str+=s[i];
}

for(int i=0;i<s.size()-n;i++)
{
    s[i]=s[i+n];
}
s.resize(s.size()-n);

return s+str;
    }
};

思考一下空间复杂度更小的解法:反正c++都支持原地修改了字符串了,我直接原地替换算了,0号位的字符和0+n的替换,1和1+n的替换,....n-1和 n-1+n的替换,这么说有点抽象,就是把前n个字符统统向后移动了一个位置,然后再移动一个位置,接下来再移动一个位置,直到我们的n-1这个位置的数移动到了字符串的末端 。,问题是这样的空间复杂度确实低了,只有O(1),但是时间复杂度蹭蹭的往上涨,也不太好。代码如下

class Solution {
public:
    string reverseLeftWords(string s, int n) {
int count=n;
while(count<s.size())
{
for(int i=count-1;i>=count-n;i--)
{
    char temp=s[i+1];
    s[i+1]=s[i];
    s[i]=temp;
}
count++;
}

return s;
    }
};

还有什么解法呢?swap()函数,我想到了这个,但是需要解决一些问题,首先字符串的长度必须是n的整数倍,如果不是,需要对原字符串扩容在减容,扩容后的位置用‘#’代替,交换完后,删除里面的‘#’,然后减容到原来的长度。具体代码如下

class Solution {
public:
    string reverseLeftWords(string s, int n) {
int length1=s.size();
int length2=length1-length1%n+n;
if(length1%n!=0){  s.resize(length2,'#');}

int key=0;
while(key<s.size()-n)
{
    for(int i=key;i<key+n;i++)
    {
        swap(s[i],s[i+n]);
    }
key+=n;
}

remove(s.begin(),s.end(),'#');
s.resize(length1);
return s;
    }
};

嗯 还有别的,有空再写。

 

标签:count,58,offer,int,复杂度,字符串,public,string
From: https://www.cnblogs.com/HaveFunnyAnyone/p/17447079.html

相关文章

  • java 中字符型 和 字符串类型有什么区别
    在Java中,字符型和字符串类型都是常用的数据类型,但是它们有着本质的不同。字符型是基本数据类型,表示单个字符,使用char表示。例如:'A'、'1'、'中'等。字符串类型是引用数据类型,表示由多个字符组成的字符串,使用String表示。例如:"hello"、"world"、"你好"等。下面列举一些它们......
  • HDU1058 Humble Numbers
    题目:HumbleNumbers humblenumber从1为"始祖",剩下的所有数,其实都是在此基础上乘以2,3,5,7演化出来的,代码主要语句:f[t]=min(2*f[i],3*f[j],5*f[k],7*f[l]);#include<iostream>#include<stdio.h>usingnamespacestd;intf[5843],n;inti,j,k,l;intmin(inta,intb,int......
  • HDU2588解析
    题目:HDU2588题意大概:给定N,M(2<=N<=1000000000,1<=M<=N),求1<=X<=N且gcd(X,N)>=M的个数。解法:数据量太大,用常规方法做是行不通的。后来看了别人的解题报告说,先找出N的约数x,    并且gcd(x,N)>=M,结果为所有N/x的欧拉函数之和。设y=N/x,y的欧拉函数为小于y且与y互质的数的个数。......
  • AT6558R导航接收芯片GPS/GNSS卫星soc单芯片
    AT6558R是一颗GNSS导航接收SOC单芯片一、芯片简介AT6558R是一款高性能BDS/GNSS多模卫星导航接收机SOC单芯片,片上集成射频前端,数字基带处理器,32位的RISCCPU,电源管理功能。芯片支持多种卫星导航系统,包括中国的北斗卫星导航系统BDS,美国的GPS,俄罗斯的GLONASS,并实现多系统......
  • 算法总结——堆栈、字符串、数组类题目
    先说stack的题目stack的实现:链表,数组题目:(1)简单的:minstack,一个数组实现三个stack(2)经典的stack问题:经典汉诺塔问题,逆波兰式计算或者产生逆波兰式,简化文件路径,验证括号对是否合法,找出最长有效括号(贪心+stack求解)(3)涉及tree的遍历问题:tree中序遍历的迭代解法,二叉搜索树的两节点和(twosu......
  • 编辑字符串距离
    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183题意:编辑距离,又称Levenshtein距离(也叫做EditDistance),是指两个字串之间,由一个转成另   一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删   除一个字符......
  • UE4字符串调试日志
    #在运行时打印输出信息原作者:Rama(opensnewwindow)此文为Logs,PrintingMessagesToYourselfDuringRuntime(opensnewwindow)的原创翻译,本文内容版权归原文所有,仅供学习,如需转载望注本文地址,翻译不易,谢谢理解。#概述Logs很重要,因为它通过给你反馈来让你知道:你的......
  • 剑指 Offer 64. 求1+2+…+n
    题目描述: 题解:利用带短路效应的递归 classSolution{publicintsumNums(intn){booleanx=n>1&&(n+=sumNums(n-1))>0;returnn;}} ......
  • 关于C++字符串的一些函数
    其实印象里,c的char用法反倒比c++的string深一点,可能是因为我对string的运用太少了吧。 提到C++的string,就得先提一下首先提一下C的char类型,毕竟C++是根据C延展过来的,继承了C的特性,而且C本身是没有string这个东西的。 char是什么?一个关键字,用于声明一个变量是字符类型。好吧,......
  • 字符串解压缩问题——贪心算法
     importsysdefload_data():returnsys.stdin.read()defget_position_map(s):result={}stack=[]fori,cinenumerate(s):ifc=="[":result[i]=-1stack.append(i)elifc=="......