numsという配列を並び替える問題で、LeetCode内でTime Limit Exceededというエラーが出ます。
nums配列は、このようになっています。[0,0,1,1,1,2,2,3,3,4]
このnumsを重複がないように並び替えて、余った要素には、''を代入します。
並び替えた後のnums配列は、[0,1,2,3,4,,,,,]です。
そしてプログラムは、重複のない数字の数である5を返します。
Time Limit Exceededというエラーを解決するためにどのように修正すればいいでしょうか?
//修正前
C
1 2int removeDuplicates(int* nums, int numsSize){ 3 4 5 int i; 6 int j; 7 int num; 8 num=numsSize; 9 10 11 for (i = 0;i < numsSize;i++) { 12 if(i!=0){ 13 if(nums[i-1]==nums[i]){ 14 num--;//重複があった分をマイナスする。ユニークな数値の数にする 15 16 for(j=i; j<numsSize-1;j++){//重複が確認されたので、全ての要素を左に詰めるためのfor loop 17 nums[j]=nums[j+1]; 18 19 if(numsSize-1==j+1){ 20 nums[j+1]='_';//要素の最後には'_'を代入 21 } 22 } 23 //重複があった場合は、左に詰めるから詰めた分を再度重複がないか確認するために、-1する。 24 i--; 25 } 26 } 27 } 28 return num; 29}
//修正後
C
1 2int removeDuplicates(int* nums, int numsSize){ 3 4 int i; 5 int num=0; 6 7 //ここでえらーが出ます。このコードは input[1,1] や、input[1]に対応するためのコードです。 8 if(nums[0]==nums[numsSize-1]){ 9 num++; 10 } 11 12 for (i = 1;i < numsSize;i++) { 13 14 15 if(nums[i-1]!=nums[i]){ 16 17 18 if(i==numsSize-1){ 19 nums[num]=nums[i-1]; 20 num++; 21 22 nums[num]=nums[i]; 23 num++; 24 25 }else{ 26 nums[num]=nums[i-1]; 27 num++; 28 } 29 } 30 } 31 32 33 return num; 34} 35 36 37
error
1================================================================= 2==30==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6020000001b0 at pc 0x55a3fe08f25d bp 0x7fff6f41e710 sp 0x7fff6f41e700 3READ of size 4 at 0x6020000001b0 thread T0 4 #2 0x7f29855c20b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2) 50x6020000001b1 is located 0 bytes to the right of 1-byte region [0x6020000001b0,0x6020000001b1) 6allocated by thread T0 here: 7 #0 0x7f2986207bc8 in malloc (/lib/x86_64-linux-gnu/libasan.so.5+0x10dbc8) 8 #3 0x7f29855c20b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2) 9Shadow bytes around the buggy address: 10 0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 11 0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 12 0x0c047fff8000: fa fa 00 04 fa fa fd fa fa fa fd fa fa fa fd fa 13 0x0c047fff8010: fa fa 00 fa fa fa fd fa fa fa fd fa fa fa fd fa 14 0x0c047fff8020: fa fa fd fa fa fa fd fa fa fa fd fa fa fa 00 00 15=>0x0c047fff8030: fa fa fd fa fa fa[01]fa fa fa fa fa fa fa fa fa 16 0x0c047fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 17 0x0c047fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 18 0x0c047fff8060: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 19 0x0c047fff8070: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 20 0x0c047fff8080: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 21Shadow byte legend (one shadow byte represents 8 application bytes): 22 Addressable: 00 23 Partially addressable: 01 02 03 04 05 06 07 24 Heap left redzone: fa 25 Freed heap region: fd 26 Stack left redzone: f1 27 Stack mid redzone: f2 28 Stack right redzone: f3 29 Stack after return: f5 30 Stack use after scope: f8 31 Global redzone: f9 32 Global init order: f6 33 Poisoned by user: f7 34 Container overflow: fc 35 Array cookie: ac 36 Intra object redzone: bb 37 ASan internal: fe 38 Left alloca redzone: ca 39 Right alloca redzone: cb 40 Shadow gap: cc 41==30==ABORTING
> Time Limit Exceededというエラーが出ます
何の話ですか? それは「エラー」なのですか?
どこぞのサイトで時間制限がある問題に取り組んでいて「そのコードだと遅ぇよ」って言われただけの話ではないのでしょうか?
競技プログラミング系のことをやっていて、プログラム実行の制限時間越えのことを言われているのでしょうか。(<C言語であれば数秒以内に完了とか) その場合、提示のコードでのやり方に問題があって、入力データによってはその時間内に完了できないのだと思われます。その問題のあるサイトのURL等を明示しましょう。
この欄にではなく、質問に加筆、修正するかたちで示してください。他の方々も閲覧するものです。
で、そのエラーの解決方法自体が課題なのだと思います。課題条件を満たせるよう充分に速いロジックを組むという。
ソコの問題には "余った要素には、'_'を代入"なんて書いてないぞ。
成り行きをみるに、ご自身ではデバッガーなどを使って実行させていないとみましたが、どうでしょう。
It does not matter what you leave beyond the returned k (hence they are underscores).
いやだから、_ を入れず放置していいってことでしょ。そもそも配列は int サイズで _ は char サイズだし。
放置したら、もともとの数値残りませんか?
It does not matter.
> It does not matter what you leave beyond the returned k
(訳) k 以降の要素に何を残しても構いません
課題文中には
> It does not matter what you leave beyond the first k elements.
としか書いていなく、Exampleの方で (hence they are underscores) が追加されているので、
「kを超えて放置された要素は問わない。だから例として'_'で埋めとくよ。(意訳)」程度の意味ではないでしょうか。必須条件ではない。
it does not matter whether underscore or something elseって意味かと思ってました。
(かぶった上の劣化意訳)
必須ではないけど、反対に言えば入れても良い。入れたところで適切なロジックでプログラムを書けばパスするはずです。問題には「O(1)で」とあるので。
「並び替え」では無くて「詰める」だけなんですね。
回答6件
あなたの回答
tips
プレビュー