题目描述
汇编语言中有一种移位指令叫做循环左移(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是正确的,前两个语句交换位置也是可以的先操作左还是先操作右都是可以的,但是要记住先链接再断开。