日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

漫画:什么是字典序算法

發(fā)布時(shí)間:2023/12/3 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 漫画:什么是字典序算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載自?漫畫:什么是字典序算法?

算法題目:

給定一個(gè)正整數(shù),實(shí)現(xiàn)一個(gè)方法來求出離該整數(shù)最近的大于自身的“換位數(shù)”。

什么是換位數(shù)呢?就是把一個(gè)整數(shù)各個(gè)數(shù)位的數(shù)字進(jìn)行全排列,從而得到新的整數(shù)。例如53241和23541。

小灰也不知道這種經(jīng)過換位的整數(shù)應(yīng)該如何稱呼,所以姑且稱其為“換位數(shù)”。

題目要求寫一個(gè)方法來尋找最近的且大于自身的換位數(shù)。比如下面這樣:

輸入12345,返回12354

輸入12354,返回12435

輸入12435,返回12453

小灰發(fā)現(xiàn)的“規(guī)律”:

輸入12345,返回12354

12354 - 12345 =?9

剛好相差9的一次方

輸入12354,返回12435

12435 - 12354 =?81

剛好相差9的二次方

所以,每次計(jì)算最近的換位數(shù),只需要加上9的N次方即可?

————————————

舉一個(gè)栗子:

給定1,2,3,4,5這幾個(gè)數(shù)字。

最大的組合:54321

最小的組合:12345

比如給定整數(shù)12354,如何找到離它最近且大于它的換位數(shù)呢?

為了和原數(shù)接近,我們需要盡量保持高位不變,低位在最小的范圍內(nèi)變換順序

那么,究竟需要變換多少位呢?這取決于當(dāng)前整數(shù)的逆序區(qū)域

如果所示,12354的逆序區(qū)域是最后兩位,僅看這兩位已經(jīng)是當(dāng)前的最大組合。若想最接近原數(shù),又比原數(shù)更大,必須從倒數(shù)第3位開始改變。

怎樣改變呢?12345的倒數(shù)第3位是3,我們需要從后面的逆序區(qū)域中尋找到剛剛大于3的數(shù)字,和3的位置進(jìn)行互換:

互換后的臨時(shí)結(jié)果是12453,倒數(shù)第3位已經(jīng)確定,這時(shí)候最后兩位仍然是逆序狀態(tài)。我們需要把最后兩位轉(zhuǎn)變回順序,以此保證在倒數(shù)第3位數(shù)值為4的情況下,后兩位盡可能小:

這樣一來,我們就得到了想要的結(jié)果12435

獲得最近換位數(shù)的三個(gè)步驟:

1.從后向前查看逆序區(qū)域,找到逆序區(qū)域的前一位,也就是數(shù)字置換的邊界

2.把逆序區(qū)域的前一位和逆序區(qū)域中剛剛大于它的數(shù)字交換位置

3.把原來的逆序區(qū)域轉(zhuǎn)為順序

  • //主流程,返回最近一個(gè)大于自身的相同數(shù)字組成的整數(shù)。
  • public static int[] findNearestNumber(int[] numbers){
  • //拷貝入?yún)?#xff0c;避免直接修改入?yún)?/li>
  • int[] numbersCopy = Arrays.copyOf(numbers, numbers.length);
  • //1.從后向前查看逆序區(qū)域,找到逆序區(qū)域的前一位,也就是數(shù)字置換的邊界
  • int index = findTransferPoint(numbersCopy);
  • //如果數(shù)字置換邊界是0,說明整個(gè)數(shù)組已經(jīng)逆序,無法得到更大的相同數(shù)字組成的整數(shù),返回自身
  • if(index == 0){
  • return null;
  • }
  • //2.把逆序區(qū)域的前一位和逆序區(qū)域中剛剛大于它的數(shù)字交換位置
  • exchangeHead(numbersCopy, index);
  • //3.把原來的逆序區(qū)域轉(zhuǎn)為順序
  • reverse(numbersCopy, index);
  • return numbersCopy;
  • }
  • private static int findTransferPoint(int[] numbers){
  • for(int i=numbers.length-1; i>0; i--){
  • if(numbers[i] > numbers[i-1]){
  • return i;
  • }
  • }
  • return 0;
  • }
  • private static int[] exchangeHead(int[] numbers, int index){
  • int head = numbers[index-1];
  • for(int i=numbers.length-1; i>0; i--){
  • if(head < numbers[i]){
  • numbers[index-1] = numbers[i];
  • numbers[i] = head;
  • break;
  • }
  • }
  • return numbers;
  • }
  • private static int[] reverse(int[] num, int index){
  • for(int i=index,j=num.length-1; i<j; i++,j--){
  • int temp = num[i];
  • num[i] = num[j];
  • num[j] = temp;
  • }
  • return num;
  • }
  • public static void main(String[] args) {
  • int[] numbers = {1,2,3,4,5};
  • for(int i=0; i<10;i++){
  • numbers = findNearestNumber(numbers);
  • outputNumbers(numbers);
  • }
  • }
  • //輸出數(shù)組
  • private static void outputNumbers(int[] numbers){
  • for(int i : numbers){
  • System.out.print(i);
  • }
  • System.out.println();
  • }
  • 這種解法擁有一個(gè)高大上的名字:字典序算法

    幾點(diǎn)補(bǔ)充:

    本漫畫純屬娛樂,還請大家盡量珍惜當(dāng)下的工作,切勿模仿小灰的行為哦。


    總結(jié)

    以上是生活随笔為你收集整理的漫画:什么是字典序算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。