jake1036

O(n)实现删除两个数组中的共同元素

           O(n)量级实现删除两个数组中的共同元素

  一问题描述:
      int  a1[] , int a2[]都是升序数组。 a1中可能含有a2[]中的数。
      求:删除a1中和a2数组中值相同的数,并返回a1后数组有效值个数。
     要注意的特殊部分:
     (1) a1,a2 中的元素都需要进行删除重复的。
     (2)数组中可能不会是严格的单调递增,会有相等的数字。
 
二 问题分析:
     

/*
  int  a1[] int a2[]都是升序数组。
  a1中可能含有a2[]中的数。
  求:删除a1中和a2数组中值相同的数,并返回a1后数组有效值个数 

*/


#include 
<iostream>
  
using namespace std ;
  
const int N = 10 ;
  
  
int a[N] = {1 , 3 , 778 , 9 , 14 , 15 , 20 , 22}//此种方法不应含有相同的数字 
  int b[N] = {2 , 3 , 37 ,15 , 15 ,17 ,19 , 20 , 20};
  
int lenb ;
  
int subtract()
  
{
    
int i  = 0 ;    //i表示数组a中的当前下标 
    int j  = 0 ;    //j表示数组b中的当期下标 
    int lena = N ;  //lena表示数组a中的元素个数 
    lenb = N ;      //lenb表示数组b中的元素个数 
   
    
//建立两个变量 分别为samea sameb
    
//因为两个队列中可能会有相同的数字
    int samea = 0 ;
    
int sameb = 0 ; 
    
    
while(i < N && j < N)
    
{
        
if(a[i] == b[j])
        
{
          lena
-- ;
          lenb
-- ;
          i
++ ; 
          j
++ ;   
          samea
++ ;
          sameb
++ ;
           
         
while(i < N) //判断数组a中是否有连续几个相等的元素 
           {               
             
if(a[i-1== a[i])
              

                 i
++ ;    
                 lena
-- ; 
                 samea
++ ; 
              }

              
else
               
break ;
           }
       
           
while(j< N)//判断数组b中是否有几个连续相等的元素 
           {           
             
if(b[j-1== b[j])
              

                 j
++ ;   
                 lenb
-- ;  
                 sameb
++ ; 
              }

              
else 
              
break ;
           }
         
          
continue ;          
        }
else
        
{
         a[i 
- samea] = a[i] ; //不相等的话,则进行移除操作 
         b[j - sameb] = b[j] ; //以后进行数组中,删除特定的数字,均可以按照此方法进行。                    
        }
          
        
if(i < N && a[i] < b[j]) {i++ ; continue ;}   //注意此处需要用if,而不需要用while 
        if(j < N && a[i] > b[j]) j++ ;   
           
    }

    
    
while(i < N)   //循环完毕之后,将之后的元素,移到前面 
      a[i - samea] = a[i++] ; 
        
    
while(j < N)
      b[j 
- sameb] = b[j++] ;    
            
        
return lena ;
  }


  
int main()
  
{
    
int lena = subtract() ;    
    
for(int i = 0 ; i < lena ; i++)
      cout
<<a[i]<<" " ;          
    cout
<<endl ;    
    
for(int i = 0 ; i < lenb ; i++)
      cout
<<b[i]<<" " ;        
  
    system(
"pause") ;
    
return 0 ;    
  }

    
 


  

posted on 2011-07-01 10:54 kahn 阅读(1369) 评论(0)  编辑 收藏 引用 所属分类: 算法相关


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理