求一程序,幫忙幫忙!


如果一個數列中的任意一段(至少兩個元素)的各個元素均相同,我們稱只為等值數列段。等值數列段中元素的個數叫等值數列段長度。現有100個元素組成的整數數列A,求A中長度最大的所有等值數列段的首末位置,並輸出該等值數列段的首末位置。如果沒有等值數列段,則輸出(NOT HAVE)
要求:所有運算均應在原數組上進行,不得引進第二個數組


用c語言實現

9 个解决方案

#1


int max_index=0,max_num = 0;
int cur_index=0,cur_num = 0;

int i;
for(i=1;i<100;++i)
{
  if(A[i] == A[i-1])
  {
    if(cur_num == 0)
    {
      cur_index = i-1;
      ++cur_num;
    }
    ++cur_num;
  }
  else if(cur_num > 0)
  {
    if(cur_num > max_num)
    {
       max_num = cur_num;
       max_index = cur_index;
    }
    cur_num = 0;
    cur_index = 0;
  }
}
if(cur_num > max_num)
{
 max_num = cur_num;
 max_index = cur_index;
}
//now get max_num
cur_index = 0;
cur_num = 0;
//output 
if(max_num == 0)
{
  printf("not have\n");
  return;
}
for(i=1;i<100;++i)
{
  if(A[i] == A[i-1])
  {
    if(cur_num == 0)
    {
      cur_index = i-1;
      ++cur_num;
    }
    ++cur_num;
  }
  else if(cur_num > 0)
  {
    if(cur_num == max_num)
    {
       //output index and number
       printf("index = %d number = %d\n",cur_index, cur_num);
    }
    cur_num = 0;
    cur_index = 0;
  }
}
if(cur_num == max_num)
{
 //output index and number
 printf("index = %d number = %d\n",cur_index, cur_num);
}

#2


我覺得樓上得好象不對呀

#3


一次遍歷就可以搞定的啦
struct Equal
{
   int nValue;
   int nStart;
   int nEnd;
   Equal *pNext;
}

int array[100];

bool bFind = flase;
int nCurrent = array[0];
for (int i=1; i<100; i++ )
{
   if ( nCurrent == array[i] )
   {
      if (bFind) {
        增加當前的等職串的長度
      } else {
         bFind = true;
         記錄一個新的 
      }
   } else {
      if (bFind ) {
         把當前的等職傳完成,和備份的最長的做比較,相等則加入,超過則替換,不足則放棄
         bFind = false;
      } else {
         donothing
      }
   }
}
if (bFind) {
   // 循環結束,結束最后的等職傳
   等同於新的結束點
}

#4


oo沒有考慮的是: 有可能最長的是多個呢
必須要考慮鏈表保存最終的數據的,然后最后一體輸出結果
沒有時間寫代碼,給出個樣子填充就是了

#5


真是強呀

謝謝
我還有問題,請多多支持

#6


tie ge wan:
CString function(int* arr, int size)
{
CString str = "not found";

int iStart = -1;
int iEnd = -1;
int iVal;

int iCnt = size;

int i = 0;
while( i < iCnt)
{
int start = i;
int value = arr[i];
int end = i;

for(int j = i+1; (j < iCnt) && (arr[i] == arr[j]); end++, j++) ;

i = j;

if((iEnd - iStart) < (end - start))
{
iVal = value;
iStart = start;
iEnd = end;
}
}

str.Format("%d %d", iStart, iEnd);
return str;
}

#7


int Start_Index,Last_Index,Length;
void fun(int *A, int N)
{
int state=1,start,len=1;
    Length=1;
Start_Index=0;
for(int i=1;i<N;i++)
{
 if(state==1)
 { 
   if(A[i]==A[i-1])
       {
 start=i-1;
 state=0;
 len++;
       }
 }
 else 
 {
   if(A[i]==A[i-1])
   {
        len++;
if(i==N-1&&Length<len)
{
Start_Index=start;
Last_Index=i;
Length=len;
}
   }
   else
   {
        state=1;
if(Length<len)
{
  Start_Index=start;
  Last_Index=i-1;
  Length=len;
}
len=1;
   }
 }
}
}
//Length為1,則沒有等值數列段。

#8


oo沒有考慮的是: 有可能最長的是多個呢
必須要考慮鏈表保存最終的數據的,然后最后一體輸出結果
沒有時間寫代碼,給出個樣子填充就是了
=======================================
遍歷兩次就是為了處理多個的情況,
另外,‘不得引進第二個數組’,所以用兩次遍歷是一種比較簡單的方法。

#9


mark,先

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com