写这篇文章的原因
今天在刷题的过程中遇到了一个题就是:判断一个字符串是否是由另一个字符串旋转得来的呢?我呢,一开始的思路是:将一个字符串的所有旋转结果都给写出来,然后再一个一个来判断。这样听起来是不是就特别麻烦,告诉你这不只是麻烦而且还容易出错,就拿我写的代码说吧。
void ReverseStr(char* str1,int m, int n) { char* left = str1 + m; char* right = str1 + n; while (left <= right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } int IsReverseStr(char* str1, char* str2, void (*p)(char* str1, int m, int n)) { int len = strlen(str1); char start[6] = "0"; strncpy(start, str1,5); for (int i = 0; i < len; i++) { ReverseStr(str1, 0,i); ReverseStr(str1, i+1,len-1); ReverseStr(str1, 0,len-1); if (0 == strcmp(str1, str2)) return 1; } return 0; } int main() { char arr1[] = "AABCD"; char arr2[] = "BCDAA"; int ret = IsReverseStr(arr1, arr2,ReverseStr); printf("%d", ret); return 0; }
有没有看出问题
对了,就是当我进行了一次字符串旋转的时候,原来的字符串里面内容的顺序也就被打乱了,我们再进行下一次操作的时候就不能得到我们想要的结果了,就是因为这个困扰了我大半天,我不断地调试修改最终以我当前的知识储备,还是没能将功能给实现,所以我就请教了老师,我一看代码我都懵了,为啥就这几行代码就能将我的几十行代码给替换,代码少不说,功能也实现了,而且逻辑也不复杂,比起我自己写的代码可好太多了。所以这里呢我想给大家分享分享我的经历,希望能告诉大家要提增强自己的逻辑能力,多刷题,多看看别人的代码是怎样写的。
代码实现
下面就是那几行打败我的代码
int findRound(const char * src, char * find) { char tmp[256] = { 0 }; //用一个辅助空间将原字符串做成两倍原字符串 strcpy(tmp, src); //先拷贝一遍 strcat(tmp, src); //再连接一遍 return strstr(tmp, find) != NULL; //看看找不找得到 }
看着是不是很不可思议,是不是觉得我之前写的代码太冗余了?大家可千万别学我这样,既浪费了时间,还没有达到目的。祝大家在以后的计算机生涯中越走越顺,谢谢大家。