剑指offer--左旋字符串

博客围绕汇编语言循环左移指令,用字符串模拟其运算结果,分享最初代码问题及修改原因,介绍string结构体库函数使用,还提及牛客网编程中substr库函数。此外,分享链表插入选择题,强调链表操作先链接再断开的要点。

题目描述

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

class Solution {

public:

string LeftRotateString(string str, int n) {

int size = str.size();//获得字符串的长度

char temp;

int i = 1;

for(i=1; i <= n; i++)

{

temp = str[0];

for (int m = 0; m < size; m++)

{

str[m] = str[m + 1];

}

str[size] = temp;

}

return str;



}

};

这是我最初提交的代码,提交完之后发现虽然旋转的时候是正确的但是结果却不是完整的。

  看了代码好几遍一直在找我的ab去哪了,后来发现了问题,一个小小的问题导致一个测试用例也没有通过。

class Solution {

public:

string LeftRotateString(string str, int n) {

int size = str.size()-1;//获得字符串的长度

char temp;

int i = 1;

for(i=1; i <= n; i++)

{

temp = str[0];

for (int m = 0; m < size; m++)

{

str[m] = str[m + 1];

}

str[size] = temp;

}

return str;



}

};

这是修改之后的代码。int size = str.size()-1,导致出现上边问题的原因是我对字符串操作的时候把\0也加进来了,所以旋转结束之后字符0在倒数第二个位置,所以后边的ab没有进行输出。

 这里我想给大家介绍的是我们的string这里也是一个结构体就和我们的vector是有很多库函数可以直接拿来使用的,这里我就用了size 。

 

class Solution {

public:

string LeftRotateString(string str, int n) {

if (n<0) return NULL;

if (n == 0) return str;

string strTemp = "";



strTemp = str.substr(0, n);

str.erase(0, n);

str += strTemp;

return str;



}

};

这里再学习一个别人的代码,在牛客网编程的时候经常会出现一些自己不知道的库函数来调用。这里的substr是复制子字符串,要求从指定位置开始,并具有指定的长度。如果没有指定长度_Count或_Count+_Off超出了源字符串的长度,则子字符串将延续到源字符串的结尾。这里把以前的字符串前n个拷贝到一个新的字符串中,然后将原数组的前n位删除,然后再让两个字符串相加。

 

 今天继续给大家分享选择题

在双向链表中指针p的结点前插入一个指针q的结点操作是()

A.p->Llink=q;q->Rlink=p;p->Llink->Rlink=q;q->Llink=q;

B.p->Llink=q;p->Llink->Rlink=q;q->Rlink=p;q->Llink=p->Llink;

C.q->Rlink=p;q->Llink=p->Llink;p->Llink->Rlink=q;p->Llink=q;

D.q->Llink=p->Llink;q->Rlink=q;p->Llink=q;p->Llink=q;

要在p前边插入一个q,在对链表插入或者删除的时候一定要记住先链接再断开,我们这里要让q链接到p的左边的元素之后才能断开。所以说A,B都直接错了,因为上来就让P->link指向q那再去找之前P前边的元素就找不到了,这样就算是从这个位置断开了。D这里最后两个语句都重复了......不知道他本来想写啥,但是C是正确的,前两个语句交换位置也是可以的先操作左还是先操作右都是可以的,但是要记住先链接再断开。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值