常見智力算法類面試題分析

1. 二進制中1 的個數
int NumberOf1(int n)
{
  int count = 0;
   while (n)
   {
     ++ count;
     n = (n-1) & n;
   }
   return count;
}
2. 出現次數超過一半的數字
     利用標記,相鄰相同就是加1,不同減1
      一個數字,一個次數
3. 找到最小的K 個數字
   維護一個大小爲K 的 二叉樹容器,最大的值與數組中數字比較,小則放入容器
4. 連續子數組的最大和
    動態規劃, f(i) = f(i - 1) + pData[i] (i!= 0 || f(i-1)>0)  // pData[i] (i==0 || f(i-1) <=0) 
    maxSub(int data[], int n)
    {
        if(n <0 ) return
       if (n ==0)  ruturn  data[i]
       if( sum[n-1] <=0)  return  data[i]
       if( sum[n-1] > 0 ) return sum[n-1] + data[i]
     }


5. 求數列中滿足條件的數,比如數列1~10,中滿足相加和爲10 的數列
思路: 利用01揹包問題解法,即放入某個數或者不放入某個數
list<int> listUse;
void find_factor(int sum, int n)
{
   if(n<=0 || sum<= 0)
	   return;

   if(sum ==n)
   {
     // listUse.reverse();
	  for(list<int>::iterator iter = listUse.begin(); iter != listUse.end(); iter++)
		  cout<<*iter<<"+";
	  cout<<n<<endl;
	 // listUse.reverse();
   }
   listUse.push_front(n);
   find_factor(sum-n,n-1);
   listUse.pop_front();
   find_factor(sum,n-1);
}

int main()
{
   int sum = 10, n = 10;
   find_factor(sum,n);
   return 0 ;
}



   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章