精華區beta Oversea_Job 關於我們 聯絡資訊
※ 引述《Baudelaire.bbs@ptt.cc (Sunnyvale)》之銘言: : ※ 引述《Baudelaire (Sunnyvale)》之銘言: : 基本上算是binary search的變形: : public static int FindSortedArrayRotation(int array[]) { : int begin = 0, end = array.length - 1; : while (end-begin>1) { : if (array[begin] > array[(begin + end) / 2]) { : end = (begin + end) / 2; : } else if (array[(begin + end) / 2] > array[end]) { : begin = (begin + end) / 2; : } else { : return (begin+end)/2+1; : } : } : return end; : } 我想方向是正確的, 但是如果 X = 0 的話,似乎會有問題..... 我精簡你的版本,在最後return前確定是真的rotate過. public static int FindSortedArrayRotation(int array[]) { int i = 0, j = array.length -1; while(j-i > 1) { if(array[(i+j)/2] > array[i]) i = (i+j)/2; else j = (i+j)/2; } if(array[j] < array[i]) return j; // Make sure array did rotate. else return 0 ; 歡迎指正 -- ※ 發信站: 批踢踢參(ptt3.cc) ◆ From: 168.7.230.23 > -------------------------------------------------------------------------- < 發信人: Yuheng.bbs@ptt3.cc (宇恆), 看板: Oversea_Job 標 題: Re: Microsoft Interview Question 發信站: 批踢踢參 (Sun Jan 27 16:11:26 2008) 轉信站: ptt!Group.NCTU!grouppost!Group.NCTU!ptt3 ※ 引述《Baudelaire.bbs@ptt.cc (Sunnyvale)》之銘言: : ※ 引述《Baudelaire (Sunnyvale)》之銘言: : : 這題據強者我ebay的朋友說,Google在on-campus也問過他這題。 : 算是quicksort裡面的in-place partition,也不會太難。 : public static int Partition(Ball[] aBalls) { : int left = 0, right = aBalls.length - 1; : BallColor pivotColor = aBalls[0].Color(); : while (left <= right) { : BallColor leftColor = aBalls[left].Color(); : BallColor rightColor = aBalls[right].Color(); : if (leftColor == pivotColor) && rightColor == pivotColor) : left++; : } else if (leftColor == pivotColor && rightColor != pivotColor) { : left++; : } else if (leftColor != pivotColor && rightColor != pivotColor) { : right--; : } else if (leftColor != pivotColor && rightColor == pivotColor) { : Ball tmp = aBalls[left]; : aBalls[left] = aBalls[right]; : aBalls[right] = tmp; : left++; right--; : } : } : return left; : } 直接改Cormen那本書裡的partition似乎可以提供更精簡的答案 請參考 Partition(Ball A[]) { i = -1; k = A.length - 1; x = A[k]; Ball temp; for(j=0; j < k; ++j) { if(A[j] != x) // Here is the key modification. { ++i; temp = A[i]; A[i] = A[j]; A[j] = temp; } } return (i+1); } -- ※ 發信站: 批踢踢參(ptt3.cc) ◆ From: 168.7.230.23