2017-08-11 16 views
0

私はamazonインタビューの質問を実装しようとしています。オーバーラップしない連続したサブアレイの最大長の合計

Find the maximum sum of lengths of non-overlapping contiguous subarrays with k as the maximum element. 
Ex: Array: {2,1,4,9,2,3,8,3,4} and k = 4 
Ans: 5 
{2,1,4} => Length = 3 
{3,4} => Length = 2 
So, 3 + 2 = 5 is the answer 

私はプログラムを実装している:私のプログラムでは

#include <iostream> 
using namespace std; 

int main() 
{ 
     int a[] = {2,1,4,9,2,3,8,3,4,2}; 
     int cnt = 0, i = 0, j = 0, ele, k = 4; 
     int tmp = 0, flag = 0; 

     ele = sizeof(a)/sizeof(a[0]); 

     for(j = 0; j < ele;) 
     { 
       i = j; 
       //while(i < ele && a[i++] <= k) //It's working fine 
       while(a[i] <= k && i++ < ele) // It's not work 
       { 
         cnt++; 
         cout<<"while"<<endl; 
       } 

       while(j < i) 
       { 
         if(a[j++] == k) 
         { 
           flag = 1; 
         } 
       } 

       if(flag == 1) 
       { 
         tmp += cnt; 
         flag = 0; 
       } 
       cnt = 0; 
       j = i; 
     } 
     cout<<"count : "<<tmp<<endl; 
     return 0; 
} 

を、私はそれが正常に動作し、正しい出力を与えています

while(i < ele && a[i++] <= k) 

を使用。

しかし、私は

while(a[i] <= k && i++ < ele) 

を使用する場合は、私のプログラムが滞っています。どうして?

+0

[OT]:あなたは[that](http://ideone.com/fj8JvB)のようなコードを単純化することができます – Jarod42

答えて

3

while(a[i] <= k && i++ < ele)とすると、実際には配列aの範囲外に出ることができ、undefined behaviorにつながります。

iは配列の最後のインデックスである場合、(後置++オペレータがインクリメント前古い値を返すため)、次いでi++ < eleは実際trueされ、その後、ループにiが範囲外であろう。

未定義の振る舞いは、未定義であり、何かが起こる可能性があります。クラッシュから無限ループまたはスタックループまで。

++i < eleのように、プレフィックスの代わりに、より良い解決策が使用されます。

+1

is 'is ++'と 'a [i]'が出現しています同じ表現で? – user463035818

+1

@ tobi303いいえ、左辺は '&&'や '||'式の右辺より前に配置されています(例:[this evaluation order reference](http://en.cppreference.com/w/cpp/language/eval_order)、特に[ルール](http://en.cppreference.com/w/cpp/language/eval_order#Rules)6)。 –

0

while(i < ele && a[i++] <= k)while(a[i] <= k && i++ < ele)間で異なるです: while(i < ele && a[i++] <= k)は最初iをインクリメントし、後で値を取得しますがwhile(a[i] <= k && i++ < ele)iele最初を比較して、後でiをインクリメントするでしょう。

プログラムは while(a[i] <= k && i++ < ele)を使い果たしたときに、 i3等しいだからあなたのコード内の

、しかしwhile(i < ele && a[i++] <= k)4に等しいです。だからこそ問題が起きたのです

関連する問題