1. 双方向ポインタの基本的な使い方
双方向ポインタは、配列全体を走査し、配列要素を前後に交換する必要がある場合に広く使用されます。
原理は 2 つのポインタを設定し、配列全体を前から後ろに走査することです。基本的な記述方法は次のとおりです。
void Reverse(char arr[], int len)
{
int left = 0;
int right = len - 1;
int tmp;
while (left < right)
{
//条件
}
}
2. 質問例
2.1 文字の逆順
文字列strの内容を反転して出力します。
データ範囲: 1 < len(str) < 10000
入力説明:
文字列を入力します。スペースを含めることもできます。
出力説明:
文字列を逆順に出力します。
void Reverse(char arr[], int len)
{
int left = 0;
int right = len - 1;
char tmp;
while (left < right)
{
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
int main()
{
char arr[10001];
gets(arr);//gets可以读取包括空格在内的字符串
int len = strlen(arr);
Reverse(arr, len);
printf("%s\n", arr);
}
2.2 パリティスワップ
質問:
整数の配列を入力し、配列内のすべての奇数が配列の前半に配置され、すべての偶数が配列の後半に配置されるように、配列内の数値の順序を調整する関数を実装します。配列。
アイデア: 双方向ポインタを使用して配列全体を走査する 合計 4 つの状況が発生する可能性があります。
1. 前は奇数、後ろは偶数 // 最も理想的な状況、操作は必要ありません—> 左++ 右--
2. 奇数の前でも // ——> 左右を入れ替え、左++ 右--
3. 前方のカップルと後方のカップル //前方のカップルを後方に変更する必要があり、右にトラバースを続ける必要があります --> 右--
4. 前後の奇数 // 後の奇数を前に変更する必要があり、左をトラバースし続ける必要があります --> left++
答え:
void reverse(int arr[], int len)
{
int tmp;
int left = 0;
int right = len - 1;
while (left < right)
{
if (arr[left] % 2 == 0 && arr[right] % 2 == 1)
{
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
else if (arr[left] % 2 == 0 && arr[right] % 2 == 0)
{
right--;
}
else if (arr[left] % 2 == 1 && arr[right] % 2 == 1)
{
left++;
}
else
{
left++;
right--;
}
}
}
int main()
{
int arr[10];
for (int i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
int len = sizeof(arr) / sizeof(arr[0]);
reverse(arr, len);
for (int i = 0; i < 10; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}