国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

一道算法題(next smaller)

mgckid / 719人閱讀

摘要:從位向右,找到比小的最大的那個(gè)數(shù),并與交換。交換后,把位向右注意是的,不是的值的所有數(shù)字降序排列。對(duì)于來(lái)說(shuō),從右向左可以分割為,,,這三種情況都是最小排列。

題目如下:

給定某一個(gè)正整數(shù),組成這個(gè)數(shù)的數(shù)字不變,返回下一個(gè)比它小的數(shù),如:

nextSmaller(21) == 12
nextSmaller(531) == 513
nextSmaller(907) == 790
nextSmaller(51226262651257) == 51226262627551

如果沒(méi)有下一個(gè)比它小的數(shù)字,或者下一個(gè)比它小的數(shù)字以0開(kāi)頭,則返回-1,如:

nextSmaller(9) == -1
nextSmaller(111) == -1
nextSmaller(135) == -1
nextSmaller(1027) == -1 // 0721以0開(kāi)頭,所以返回-1
算法描述(找到下一個(gè)比它小的數(shù)):

1.find pivot:這個(gè)數(shù)從右往左,一位位地來(lái)比較,如果第i位的數(shù)字,比第i+1位的數(shù)字大,則把第i位的數(shù)字置為pivot(標(biāo)志位)。
2.swap:從pivot位向右,找到比pivot小的最大的那個(gè)數(shù),并與pivot交換。
3.sort:交換后,把pivot位向右(注意是pivot的index,不是pivot的值)的所有數(shù)字降序排列。
這樣,新得到的數(shù)就是下一個(gè)比它小的數(shù)。

舉例分析:

比如我們拿54123來(lái)分析。
1.find pivot:從最右邊的3來(lái)看,因?yàn)?沒(méi)有第i+1位數(shù)字(3沒(méi)有右邊),所以左移一位到2;2比右邊的3小,所以繼續(xù)左移一位到1;同理,1也比2要小,所以繼續(xù)左移一位到4;4比1要大了,那么把4置為pivot,這時(shí)停止。
2.swap:現(xiàn)在4是pivot,那么從4向右,有1,2,3三個(gè)數(shù)字,并且都比4小,這其中3是最大的,所以把4和3的位置交換,得到53124。
3.sort:交換后,pivot位上是3,把3往右的所有數(shù)字降序排列,得到53421,這就是下一個(gè)比54123小的數(shù)。

為什么這樣做?

下面是我自己思考的為什么,不一定對(duì)。

對(duì)于每個(gè)數(shù),它最小的排列只有1種情況,就是權(quán)位從高到低,數(shù)字從小到大排列。
比如123的最小排列就是123。
對(duì)于54123來(lái)說(shuō),從右向左可以分割為3,23,123,這三種情況都是最小排列。
也就是說(shuō),如果我們只對(duì)3或者23或者123進(jìn)行重組,是沒(méi)有變化的。
于是再向左進(jìn)行分割,得到5和4123,發(fā)現(xiàn)4123已經(jīng)不再是最小排列了,換句話(huà)說(shuō)4123肯定有下一個(gè)比它小的數(shù),就把4標(biāo)記出來(lái),對(duì)4123進(jìn)行重組。
怎么重組呢?最高的權(quán)位,放上比4稍小的,也就是3,然后對(duì)于3xxx的后三位,放上值最大的情況,就是412的降序排列421,這樣就能保證“3421是4123的上一個(gè)數(shù)”。

總結(jié):

這個(gè)算法一句話(huà)總結(jié):對(duì)于某個(gè)數(shù),從右向左找它的子列,如果子列是最小排列,那子列沒(méi)法重組,繼續(xù)向右;如果子列不是最小排列,就對(duì)子列進(jìn)行重組。

感覺(jué)算法里,“分治”加“pivot(標(biāo)志位)”的解法很常用啊,把復(fù)雜情況分成最簡(jiǎn)單的子情況,如果符合規(guī)律,那么子情況擴(kuò)充,如果不符合規(guī)律,那么置上標(biāo)志位,再進(jìn)行考慮。

下面是寫(xiě)得不怎么樣的代碼:
function nextSmaller(num) {
  var arr = [];
  (num + "").split("").forEach(function (val) {
    arr.push(parseInt(val));
  });
  // 1st: find the pivot, if digit is greater than its right digit, it becomes a pivot
  var pivot = -1;
  for(var i = arr.length - 2; i >= 0;i--) {
    if (arr[i] > arr[i + 1]) {
      pivot = i;
      break;
    }
    if (i == 0) {
      return -1;
    }
  }
  // 2nd: find the least less than the pivot, and swap them
  var swap = -1;
  for (i = pivot + 1;i < arr.length;i++) {
    if (swap < 0) {
      if (arr[i] < arr[pivot]) {
        swap = i;
      }
    } else {
      if (arr[i] < arr[pivot] && arr[i] > arr[swap]) {
        swap = i
      }
    }
  }
  var _mem;
  _mem = arr[pivot];
  arr[pivot] = arr[swap];
  arr[swap] = _mem;
  if (arr[0] == 0) {
    return -1;
  }
  // 3rd: sort the right of pivot, decreasingly
  var firstArray = arr.slice(0, pivot + 1);
  var secondArray = arr.slice(pivot + 1);
  secondArray.sort(function (a, b) {
    return b -a;
  });
  // 4th: return val
  var result = (firstArray.concat(secondArray)).join("");
  if (result == num){
    return - 1
  }
  return parseInt(result);
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/81103.html

相關(guān)文章

  • 每日一道算法

    摘要:遇到的坑剛拿到這道題就直接做了這樣的判斷,可是萬(wàn)一是這個(gè)判斷就是錯(cuò)誤的了。思路二上述算法遍歷了兩次鏈表,還額外申請(qǐng)了一個(gè)數(shù)組空間,效率不高,不如直接就地反轉(zhuǎn)鏈表,更改每個(gè)節(jié)點(diǎn)自身的指針。 2018.10.14 來(lái)源:劍指offer 題目:反轉(zhuǎn)鏈表 輸入一個(gè)鏈表,反轉(zhuǎn)鏈表后,輸出新鏈表的表頭。思路一:把所有鏈表內(nèi)容都輸入到一個(gè)數(shù)組,再次遍歷鏈表,得到數(shù)組反轉(zhuǎn)后的值,最后輸出原來(lái)的head...

    The question 評(píng)論0 收藏0
  • 一道前端面試談起

    摘要:但是題目非要弄成鏈表的形式,說(shuō)實(shí)在的,我真沒(méi)有見(jiàn)過(guò)前端什么地方還需要用鏈表這種結(jié)構(gòu)的除了面試的時(shí)候,所以說(shuō)這種題目對(duì)于實(shí)際工作是沒(méi)什么用處的,但是腦筋急轉(zhuǎn)彎的智商題既然這樣出了,我們就來(lái)看看怎么解決它吧。 今天在知乎上看到一個(gè)回答《為什么前端工程師那么難招?》,作者提到說(shuō)有很多前端工程師甚至連單鏈表翻轉(zhuǎn)都寫(xiě)不出來(lái)。說(shuō)實(shí)話(huà),來(lái)面試的孩子們本來(lái)就緊張,你要冷不丁問(wèn)一句單鏈表翻轉(zhuǎn)怎么寫(xiě),估計(jì)...

    darkbaby123 評(píng)論0 收藏0
  • 每日一道算法 - LongestWord(easy-1)

    摘要:規(guī)則使用語(yǔ)言,讓函數(shù)獲取傳遞的參數(shù)并返回字符串中的最大單詞。忽略字符串中標(biāo)點(diǎn)符號(hào)并假設(shè)不會(huì)為空。測(cè)試用例思路通過(guò)過(guò)濾字符串,并把字符串根據(jù)空格符轉(zhuǎn)換成字符串?dāng)?shù)組通過(guò)循環(huán)把獲取字符串?dāng)?shù)組中的長(zhǎng)度最長(zhǎng)的字符串 雖然都是很簡(jiǎn)單的算法,每個(gè)都只需5分鐘左右,但寫(xiě)起來(lái)總會(huì)遇到不同的小問(wèn)題,希望大家能跟我一起每天進(jìn)步一點(diǎn)點(diǎn)。更多的小算法練習(xí),可以查看我的文章。 規(guī)則 Using the JavaS...

    plokmju88 評(píng)論0 收藏0
  • [Java] 關(guān)于一道面試的思考

    摘要:對(duì)于這種會(huì)退出的情況,數(shù)組顯然不能像鏈表一樣直接斷開(kāi),因此采用標(biāo)記法先生成一個(gè)長(zhǎng)度為的布爾型數(shù)組,用填充。中對(duì)整個(gè)進(jìn)行遍歷才能得到此時(shí)數(shù)組中的數(shù)量。 文中的速度測(cè)試部分,時(shí)間是通過(guò)簡(jiǎn)單的 System.currentTimeMillis() 計(jì)算得到的, 又由于 Java 的特性,每次測(cè)試的結(jié)果都不一定相同, 對(duì)于低數(shù)量級(jí)的情況有 ± 20 的浮動(dòng),對(duì)于高數(shù)量級(jí)的情況有的能有 ± 10...

    rozbo 評(píng)論0 收藏0
  • Java數(shù)據(jù)結(jié)構(gòu)與算法——鏈表(面試)

    摘要:前言數(shù)據(jù)結(jié)構(gòu)與算法專(zhuān)題會(huì)不定時(shí)更新,歡迎各位讀者監(jiān)督。指針?lè)崔D(zhuǎn)實(shí)現(xiàn)鏈表反轉(zhuǎn)代碼反轉(zhuǎn)鏈表獲取當(dāng)前下下個(gè)元素測(cè)試代碼部分用到了上篇文章數(shù)據(jù)結(jié)構(gòu)與算法鏈表的代碼段,請(qǐng)移步獲取。 聲明:碼字不易,轉(zhuǎn)載請(qǐng)注明出處,歡迎文章下方討論交流。 前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專(zhuān)題會(huì)不定時(shí)更新,歡迎各位讀者監(jiān)督。本文是上篇文章Java數(shù)據(jù)結(jié)構(gòu)與算法——鏈表的擴(kuò)展篇,介紹鏈表的特點(diǎn),使用場(chǎng)景、鏈表的性能分析以...

    keke 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<