私はJavaで1つのプログラムを実装しましたが、驚くべきことに、特定のテストケースで1億7700万のメモリを消費しました(プログラムは1つのWebサイトでテストされているため、持っていません)。
問題は、文字列S1に存在する文字列S2のすべての文字を見つけることでした。そして、そのようなケースはN個あります。
public static void main(String[] args) throws Exception {
BufferedReader bin = new BufferedReader (new InputStreamReader (System.in));
String jewel, stone;
int t = Integer.parseInt (bin.readLine());
int count;
int i;
while (t-->0) {
count = 0;
jewel = bin.readLine();
stone = bin.readLine();
for (i=0; i<stone.length(); i++) {
if (jewel.indexOf(stone.charAt(i)) !=-1) {
count++;
}
}
System.out.println(count);
}
}
また、177MのRAMがどのように使用されているのかもわかりません。彼らが巨大なファイルをテストしているとしても、2つの文字列しかありません。ただし、コードは完全に機能し、テストケースは合格しました。
Javaプログラムは大量のメモリを消費していたので、同じプログラムのCバージョンを作成することを計画しました。次のとおりです。
int main ()
{
char * pch;
char jewel[100], stone[100];
int n;
scanf("%d",&n);
int len;
int tp;
int count = 0;
getchar(); // remove trailing '\n'
while (n-->0) {
gets(jewel);
pch = gets(stone);
count = 0;
while(*pch ) {
if (strchr(jewel, *pch)) {
count++;
}
pch++;
}
printf("%d\n", count);
}
return 0;
}
いくつかの既存のケースでは、それは機能しています。プログラムも正しいようです。しかし、なぜそれがすべてのテストケースに正しく合格しているのか理解できません。
すべての文字列バッファは、新しい行で区切られた着信文字列を保持するのに十分な長さです。
編集:に 変更""+stone.charAt(i))
しても効果stone.charAt(i))
がなく、同じ量のメモリが必要でした。また、なぜこのCコードはすべてのテストケースに合格できないのですか?