C テストの問題
質問6:请编写一个函数void fun(char a[],char b[],int n),其功能是:删除一个字符串中指定下标的字符。其中,a指向原字符串,删除后的字符串存放在b所指的数组中,n中存放指定的下标。
ChatGPT は次のように答えます。
以下の知識点が主に調査されました。
1.“求整数中每个数字出现的次数”
この問題では、データ構造におけるハッシュ テーブル (Hash Table) またはマップ (Map) の使用が主に検討されます。ハッシュ テーブルは、データをキーと値のペアの形式で保存するデータ構造であり、データの高速な挿入、検索、削除を可能にします。この問題では、ハッシュ テーブルを使用して各数値の出現回数を記録し、ハッシュ テーブルを走査して結果を出力します。
2.“找到数组中最大元素在数组中的下标”
この問題については、基本的なアルゴリズムのアイデアが主に調査されます。配列を走査する方法を使用して、現在の最大要素の値と添字を毎回記録し、最後に最大要素の添字を出力できます。
3.“删除字符串中指定下标的字符”
この問題では、文字列の基本的な操作とポインタの使い方を主に調べます。ポインタを使用して文字列内の文字を移動したり、指定された添え字を持つ文字を削除したりできます。具体的には、まず指定された添え字の前の文字にポインタを移動し、次にポインタを 1 ビット戻し、指定された添え字の文字をスキップし、最後にポインタの後ろの文字を 1 つずつ前に移動します。
プログラムの問題解決のアイデア:
1. については第一个问题,求整数中每个数字出现的次数
、ハッシュ テーブルを使用して解決できます。具体的には、整数の各ビットを調べ、各数値をキーとして使用し、出現回数を値としてハッシュ テーブルに保存します。次に、ハッシュ テーブルを走査し、結果を出力します。
2. このために第二个问题,找到数组中最大元素在数组中的下标
、配列を走査する方法を使用して、現在の最大要素の値と添字を毎回記録し、最後に最大要素の添字を出力します。
3. の場合第三个问题,删除字符串中指定下标的字符
、ポインタを使用して文字列内の文字を移動し、指定された添え字を持つ文字を削除できます。具体的には、まず指定された添え字の前の文字にポインタを移動し、次にポインタを 1 ビット戻し、指定された添え字の文字をスキップし、最後にポインタの後ろの文字を 1 つずつ前に移動します。
解決策: C 言語コードの実装:
#include <stdio.h>
void fun(char a[], char b[], int n) {
int i = 0, j = 0;
while (a[i] != '\0') {
if (i != n) {
b[j] = a[i];
j++;
}
i++;
}
b[j] = '\0';
}
int main() {
char str1[] = "Hello World";
char str2[100];
int n = 6;
fun(str1, str2, n);
printf("Original string: %s\n", str1);
printf("Modified string: %s\n", str2);
return 0;
}
上記のコードでは、fun
元の文字列 a、新しい文字列 b、および削除する文字の添え字 n の 3 つのパラメータを受け入れる関数を定義します。関数では、while ループを使用して、元の文字列 a の各文字を走査します。指定された添え字 n を走査するとき、この文字をスキップし、残りの文字を新しい文字列 b にコピーします。最後に、新しい文字列の末尾に文字列の終端マーカー '\0' を追加します。main
関数では、生の文字列を定義しstr1
、それをfun
変更のために関数に渡します。最後に、元の文字列と変更された文字列を出力して、プログラムが正しいかどうかを確認します。
解決策 2: ポインターを使用して関数を実装します。具体的なコードは次のとおりです。
void fun(char a[], char b[], int n) {
int len = strlen(a);
int i, j;
for (i = 0, j = 0; i < len; i++) {
if (i != n) {
// 如果不是指定下标,则将字符复制到新的数组中
b[j++] = a[i];
}
}
b[j] = '\0'; // 在新数组末尾添加'\0',表示字符串结束
}
int main() {
char str1[] = "Hello World";
char str2[100];
int n = 6;
fun(str1, str2, n);
printf("Original string: %s\n", str1);
printf("Modified string: %s\n", str2);
return 0;
}
この関数は、まず元の文字列の長さを計算し、次に 2 つのポインター i と j を使用して元の文字列と新しい文字列を走査します。i が指す文字が指定された添字 n ではない場合は、その文字を新しい文字列にコピーします。それ以外の場合は、その文字をスキップします。最後に、新しい文字列の末尾に「\0」を追加して、文字列の終わりを示します。
解決策 3: 文字配列のシフト演算を使用して関数を実装します。具体的なコードは次のとおりです。
void fun(char a[], char b[], int n) {
int len = strlen(a);
int i;
for (i = 0; i < len; i++) {
if (i != n) {
// 如果不是指定下标,则将字符复制到新的数组中
b[i - (i > n)] = a[i];
}
}
b[len - 1] = '\0'; // 在新数组末尾添加'\0',表示字符串结束
}
int main() {
char str1[] = "Hello World";
char str2[100];
int n = 6;
fun(str1, str2, n);
printf("Original string: %s\n", str1);
printf("Modified string: %s\n", str2);
return 0;
}
この関数は元の文字列もトラバースし、i が指す文字が指定された添え字 n でない場合、その文字を新しい文字列にコピーし、n の後の文字を 1 ビット前に移動します。最後に、新しい文字列の末尾に「\0」を追加して、文字列の終わりを示します。