常见题目类型:
先看两道相同类型题目。
这两道题的相同之处在于都是变化字符串的顺序,但其中某些部分按原来位置不变。
解题思路:
按照旋转数组进行解答。
首先将后k个逆置,再将前n-k个逆置,最后整体逆置。即可得到答案。三步逆置也就体现了算法的核心思维,也就是三步翻转法。
注意三步翻转法,无论是先整体逆置还是后整体逆置,效果是一样的,都翻转了两次
算法实现:
上述需要创建一个逆置函数,便于调用。只需要给出逆置的范围,左下标和右下标。
注意左下标和右下标的值,容易出错。
逆置函数的实现,在于左右下标的互换。
//旋转数组 void reverse(int *arr,int left,int right) { while (left <= right) { int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; left++; right--; } } int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int k = 0; scanf("%d", &k); reverse(arr,10-k,9); reverse(arr,0,10-k-1 ); reverse(arr,0,9 );//三步翻转 for (int i=0;i<10;i++) { printf("%d ", arr[i]); } return 0; }
#include<string.h> //倒置单词 void reverse(char* arr,int left,int right) { while (left <= right) { char tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; left++; right--; } }
int main() { char arr[100] = { 0 };//时刻要注意初始化 gets(arr); int len = strlen(arr);//C语言计算字符串的长度用strlen函数 //printf("%d", len); int left = 0; int right = left; reverse(arr, 0, len - 1); while (arr[right]!='\0') { while (arr[right] == ' ') { reverse(arr, left, right-1); left = right + 1; right = left; } right++; } reverse(arr, left, len - 1); for (int i=0;i<len;i++) { printf("%c", arr[i]); } return 0; }