本文重點
- 左旋字串
- 法一:暴力求解
- 法二:逆序三次
- 拓展:判斷一個字串是否為另一個字串旋轉后的字串
- 法一:窮舉暴力求解
- 法二:追加
💜新專欄開通
biubiu~
😇日后小邊會逐漸完善這個專欄,把所有面試經典題目都分享給小伙伴們
想得到就別等待趁現在去熱愛呀!
正文開始@邊通書
左旋字串
題目描述:
字串左旋
題目內容:
實作一個函式,可以左旋字串中的k個字符,
例如:
ABCD左旋一個字符得到BCDA
ABCD左旋兩個字符得到CDAB
法一:暴力求解
💛思路:

代碼實作:
#include<stdio.h>
#include<assert.h>
#include<string.h>
void left_move(char* arr, int k)
{
assert(arr);//斷言--防止傳入空指標
int i = 0;
int len = strlen(arr);
for (i = 0; i < k; i++)
{
//左旋一個字符
//1.保存第一個字符
char tmp = *arr;
int j = 0;
//2.將后續的字符一次向前移動
for (j = 0; j < len; j++)
{
*(arr + j) = *(arr + j + 1);
}
//3.把保存好的第一個字符放在末位
*(arr + len - 1) = tmp;
}
}
int main()
{
char arr[] = "ABCD";
int k = 0;
scanf("%d", &k);
left_move(NULL, k);
printf("%s\n", arr);
return 0;
}
注:
定義arr時,
?不可用char* p = "ABCD";的形式,因為"ABCD"是常量字串,不可更改,而這里要對字串左旋,
??而要用char arr[] = "ABCD";以字串初始化陣列,字符陣列可以被更改,
測驗用例:

法二:逆序三次
💛思路:

代碼實作:
#include<stdio.h>
#include<string.h>
#include<assert.h>
//逆序
void reverse(char* left, char* right)
{
assert(left&&right);//斷言
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
int len = strlen(arr);
int k = 2;
reverse(arr, arr + k - 1);//逆序左邊
reverse(arr + k, arr + len - 1);//逆序右邊
reverse(arr, arr + len - 1);//逆序整體
printf("%s\n", arr);
return 0;
}
測驗用例:

拓展:判斷一個字串是否為另一個字串旋轉后的字串
題目描述:
字串旋轉結果
題目內容: 寫一個函式,判斷一個字串是否為另外一個字串旋轉之后的字串,
例如:
給定s1 = AABCD和s2 = BCDAA,回傳1
給定s1 = abcd和s2 = ACBD,回傳0
AABCD左旋一個字符得到ABCDA
AABCD左旋兩個字符得到BCDAA
AABCD右旋一個字符得到DAABC
法一:窮舉暴力求解
💛思路:
窮舉:每次旋轉arr1的一個字符,與arr2比較, 利用上文已經寫好的
left_move函式,
代碼實作:
#include<stdio.h>
#include<string.h>
#include<assert.h>
void reverse(char* left, char* right)
{
assert(left&&right);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void left_move(char* arr, int k)
{
assert(arr);
int len = strlen(arr);
k %= len;
reverse(arr, arr + k - 1);//逆序左邊
reverse(arr + k, arr + len - 1);//逆序右邊
reverse(arr, arr + len - 1);//逆序整體
}
//判斷一個字串是否為另外一個字串旋轉之后的字串
int is_left_move(char* arr1, char* arr2)
{
assert(arr1&&arr2);
int len = strlen(arr1);
int i = 0;
for (i = 0; i < len; i++)
{
left_move(arr1, 1);//每次旋轉1個字符,比較
if (strcmp(arr1, arr2) == 0)
{
return 1;
}
}
return 0;
}
int main()
{
char arr1[] = "AABCD";
char arr2[] = "ABCD";
int ret = is_left_move(arr1, arr2);
if (ret == 1)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
測驗用例:

法二:追加
💛思路:

簡單介紹strncat和strstr的使用:


代碼實作:
#include<stdio.h>
#include<string.h>
#include<assert.h>
int is_left_move(char* arr1, char* arr2)
{
assert(arr1&&arr2);//斷言
int len1 = strlen(arr1);
int len2 = strlen(arr2);
//1.在arr1后追加一個arr1字串
strncat(arr1, arr1, len1);
//2.判斷arr2是否為arr1的子串且字串長度要相等
if (NULL != strstr(arr1, arr2) && len1 == len2)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
char arr1[20] = "AABCD";//要保證arr1開辟空間足夠大
char arr2[] = "ABCD";
int ret = is_left_move(arr1, arr2);
if (ret == 1)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
測驗用例:

本文完@邊通書
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/300031.html
標籤:其他
上一篇:究竟死了幾條狗?
下一篇:更高效地刷OJ——Java中常用的排序方法,Array.sort(),Arrays.parallelSort(), Collections.sort()
