亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: forrestgang
打印 上一主題 下一主題

華為面試題(8分鐘寫出代碼) [復(fù)制鏈接]

論壇徽章:
0
131 [報(bào)告]
發(fā)表于 2006-11-18 23:36 |只看該作者
int dist = 0;
int temp = 0;
for( int i=0; i<N; i++){
    if( abs(dist+A-B) < abs(dist+B-A) ){
          dist += A-B;
    }else{
          change(A,B);
          dist += A-B;
    }
}


說明:上述程序的目標(biāo)是使交換后A數(shù)組的和減去B數(shù)組的和的絕對(duì)值最小,也就是兩者之間相差最少
最終dist保存的即為兩者之間的差
我就寫了個(gè)例子驗(yàn)證了一下上述程序
A:  2   4    5    8
B:  1   7    6    9
按照上述規(guī)則,交換5-6,8-9,最終dist==0
如有錯(cuò)誤請(qǐng)大家指出

[ 本帖最后由 dark_ql 于 2006-11-18 23:59 編輯 ]

論壇徽章:
0
132 [報(bào)告]
發(fā)表于 2006-11-19 00:00 |只看該作者
這個(gè)帖子有點(diǎn)無聊了。很多人都只看第一貼,自己重復(fù)了別人的錯(cuò)誤還不知道。
要是說是微軟面試題估計(jì)更火爆。

論壇徽章:
0
133 [報(bào)告]
發(fā)表于 2006-11-19 10:24 |只看該作者
沒想出好的算法 我的思路把2n個(gè)數(shù)放在一個(gè)數(shù)組里 然后用組合找出n個(gè)數(shù) 求和 另n個(gè)數(shù)也求和 做查
求出所有這樣的差值的最小值,故復(fù)雜度為theta( C(2n, n))再把原數(shù)組的值經(jīng)過有限次的交換 調(diào)整成最優(yōu)解的數(shù)組值就行了
其中C(2n, n)用的是回溯 構(gòu)架是

  1. void select_combination(int l, int p)
  2. {
  3.         int i;

  4.         if (l == n)
  5.         {
  6.                 。。。
  7.                 return;
  8.         }

  9.         for(i=p; i<=2*n-(n-l); ++i) //上個(gè)位置填的是num[p-1],本次從num[p]開始試探
  10.         {
  11.                 b[i] = true;
  12.                 select_combination(l+1, i+1); //填下一個(gè)位置
  13.                 b[i] = false;
  14.         }
  15. }
復(fù)制代碼


下面是整個(gè)程序

  1. #include <stdio.h>
  2. #include <math.h>

  3. const int n = 3;
  4. int num[2*n];
  5. bool b[2*n];
  6. bool bc[2*n];
  7. bool first = true;
  8. int de, sumae, sumbe;
  9. int mins;

  10. void copy(bool p[], bool q[], int n)
  11. {
  12.         for (int i = 0; i < n; ++i)
  13.         {
  14.                 q[i] = p[i];
  15.         }
  16. }

  17. void select_combination(int l, int p)
  18. {
  19.         int i;

  20.         if (l == n)
  21.         {
  22.                 int suma = 0, sumb = 0;
  23.                 for (i=0; i<2*n; ++i)
  24.                 {
  25.                         if (b[i])
  26.                                 suma += num[i];
  27.                         else
  28.                                 sumb += num[i];                       
  29.                 }


  30.                 if (first)
  31.                 {
  32.                         first = false;
  33.                         mins = abs(suma - sumb);
  34.                         de = mins;
  35.                         sumae = suma;
  36.                         sumbe = sumb;                       
  37.                 }
  38.                
  39.                 else
  40.                 {
  41.                         int d = abs(suma - sumb);
  42.                         if (d < mins)
  43.                         {
  44.                                 mins = d;
  45.                                 copy(b, bc, 2*n);
  46.                                 de = mins;
  47.                                 sumae = suma;
  48.                                 sumbe = sumb;
  49.                         }
  50.                 }

  51.                 return;
  52.         }

  53.         for(i=p; i<=2*n-(n-l); ++i) //上個(gè)位置填的是num[p-1],本次從num[p]開始試探
  54.         {
  55.                 b[i] = true;
  56.                 select_combination(l+1, i+1); //填下一個(gè)位置
  57.                 b[i] = false;
  58.         }
  59. }

  60. bool find(int a[], int n, int va, int& pos)
  61. {
  62.         for (int i = 0; i < n; ++i)
  63.         {
  64.                 if (va == a[i])
  65.                 {
  66.                         pos = i;
  67.                         return true;
  68.                 }
  69.         }

  70.         return false;
  71. }
  72. void swap(int& a, int& b)
  73. {
  74.         int tem = a;
  75.         a = b;
  76.         b = tem;
  77. }

  78. int main()
  79. {
  80.         int a[n] = {1,4, 7};
  81.         int c[n] = {2,5,12};
  82.         int i, suma = 0, sumc = 0;
  83.         for (i = 0; i < 2*n; ++i)
  84.         {
  85.                 if (i < n)
  86.                 {
  87.                         num[i] = a[i];
  88.                         suma += a[i];
  89.                 }

  90.                 else
  91.                 {
  92.                         num[i] = c[i-n];
  93.                         sumc += c[i-n];
  94.                 }
  95.                
  96.                 b[i] = false;
  97.         }
  98.         select_combination(0, 0);

  99.         // 下面是追蹤交換的順序
  100.         int ac[n], cc[n], p = 0, q = 0;
  101.         for (i = 0; i < 2*n; ++i)
  102.         {
  103.                 if (bc[i])
  104.                         ac[p++] = num[i];

  105.                 else
  106.                         cc[q++] = num[i];
  107.         }

  108.         p = 0;
  109.         int pos;
  110.        
  111.         // 使a中的值與ac中的值相同
  112.         while (p < n)
  113.         {
  114.                 if (a[p] == ac[p])
  115.                 {
  116.                         ++p;
  117.                         continue;
  118.                 }

  119.                 else
  120.                 {

  121.                         if (find(c, n, ac[p], pos))
  122.                         {
  123.                                 printf("swap %d in a[%d] and %d in c[%d]\n",
  124.                                                  a[p],   p,      c[pos],  pos);
  125.                                 swap(a[p], c[pos]);
  126.                         }

  127.                         // a[p] 一定在數(shù)組a里 需交換3次
  128.                         else
  129.                         {
  130.                                 find(a, n, ac[p], pos);

  131.                                 printf("swap %d in a[%d] and %d in c[%d]\n",
  132.                                                  a[p],   p,      c[0],  0);
  133.                                 swap(a[p], c[0]);

  134.                                 printf("swap %d in a[%d] and %d in c[%d]\n",
  135.                                                  a[pos],   pos,      c[0],  0);
  136.                                 swap(a[pos], c[0]);

  137.                                 printf("swap %d in a[%d] and %d in c[%d]\n",
  138.                                                  a[p],   p,      c[0],  0);
  139.                                 swap(a[p], c[0]);
  140.                         }
  141.                 }
  142.        
  143.                 ++p;
  144.         }

  145.         // 使c中的值與cc中的值相同
  146.         q = 0;
  147.         while (q < n)
  148.         {
  149.                 if (c[q] == cc[q])
  150.                 {
  151.                         ++q;
  152.                         continue;
  153.                 }

  154.                 else
  155.                 {
  156.                         find(c, n, cc[q], pos);

  157.                         printf("swap %d in c[%d] and %d in a[%d]\n",
  158.                                              c[q],   q,      a[0],  0);
  159.                         swap(c[q], a[0]);

  160.                         printf("swap %d in c[%d] and %d in a[%d]\n",
  161.                                              c[pos],   pos,      a[0],  0);
  162.                         swap(c[pos], a[0]);

  163.                         printf("swap %d in c[%d] and %d in a[%d]\n",
  164.                                              c[q],   q,      a[0],  0);
  165.                         swap(c[p], a[0]);

  166.                 }
  167.                 ++q;
  168.         }
  169.         printf("\n交換前suma: %d, sumb: %d\n", suma, sumc);

  170.         printf("交換后suma: %d, sumb: %d\n", sumae, sumbe);

  171.         return 0;
  172. }
復(fù)制代碼

論壇徽章:
0
134 [報(bào)告]
發(fā)表于 2006-11-20 02:17 |只看該作者
原帖由 mike_chen 于 2006-11-13 09:34 發(fā)表
放到一個(gè)臨時(shí)數(shù)組里排序后,兩頭取,分別存在a,b里


我同意這個(gè)

論壇徽章:
0
135 [報(bào)告]
發(fā)表于 2006-11-20 06:27 |只看該作者
你們還在討論這個(gè)問題呢...題說交換,又沒說要給出交換的過程。。所以完整程序很簡(jiǎn)單......變個(gè)思維想想么
呵呵

論壇徽章:
0
136 [報(bào)告]
發(fā)表于 2006-11-20 06:39 |只看該作者
另外,xmyth 的算法是基于貪心的,所以并不是最優(yōu)的,只不過大多時(shí)候是最優(yōu)的而已

論壇徽章:
0
137 [報(bào)告]
發(fā)表于 2006-11-20 06:44 |只看該作者
再羅嗦點(diǎn).....認(rèn)清此題問題本是NP問題,就不會(huì)去想一些自以為很好的算法了
老老實(shí)實(shí)回朔剪枝吧,此題剪枝才是優(yōu)化的王道,目前我用了3處剪枝已經(jīng)將速度加速了很多
比較遺憾的是題目沒給n范圍,所以不好考慮剪枝的代價(jià),所以我認(rèn)為不給出n的規(guī)模此題寫起來沒什么意義,
所以代碼也就不貼了。。。。

論壇徽章:
0
138 [報(bào)告]
發(fā)表于 2006-11-20 13:01 |只看該作者
參加tyc611 的帖子
發(fā)現(xiàn)xmyth算法的模型還是有問題,如tyc611的例子,同時(shí)交換不能只限于一個(gè)元素

我的想法:
也許可以拓展成只要找到x在(0, A], 合集,不是開集,就進(jìn)行交換

例子如下:
3,5,6,7,13,14   sum = 48
1,3,7,8,10,17   sum = 46

因?yàn)閍[1] - b[1] = 2,  在(0, 2]之間, 且沒有更逼近于A/2的選擇,故交換之

3,3,7,8,10,17    sum = 48
1,5,6,7,13,14    sum = 46
現(xiàn)在a[3] - b[3] = 1, 在(0,2]之間, 交換

3,3,6,8,10,17  sum = 47
1,5,7,7,13,14    sum = 47

得到最佳結(jié)果

論壇徽章:
0
139 [報(bào)告]
發(fā)表于 2006-11-20 16:56 |只看該作者
我前面提出的算法的確是錯(cuò)誤的,貪婪算法在這種情況下不可行。

而樓上的想法也是錯(cuò)誤的,比如這個(gè)簡(jiǎn)單的例子就行不通了

a = {11,12,8,91}
b = {1,2,17,100}

動(dòng)態(tài)規(guī)劃算法對(duì)這個(gè)題目應(yīng)該是適用的
該題等價(jià)于在2n中元素中選取n個(gè)元素,使得這n個(gè)元素的和最接近于2n個(gè)元素總和的一半

/*
* 在數(shù)組c中的n個(gè)元素中選取m個(gè)元素,使得這m個(gè)元素的和最接近y
* func(c, n, m, y) 就表示這m個(gè)元素的和
* 然后通過比較func(c, n, m, y) 和 func(c + 1, n - 1, m, y) 就可以確定選取的這m個(gè)元素是哪幾個(gè)
*/

func(int *c, int n, int m, int y) {
  if (m == 0)
    return 0;
  if (n == m)
    return sum(c, n);
  a = func(c + 1, n - 1, m, y);
  b = func(c + 1, n - 1, m - 1, y - *c) + *c;
  return abs(y - a) <= abs(y - b) ? a:b;
}

[ 本帖最后由 xmyth 于 2006-11-21 21:01 編輯 ]
新新手 該用戶已被刪除
140 [報(bào)告]
發(fā)表于 2006-11-20 18:36 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP