2014年美團校招之——輸出字典序為第k的排列(0
思路:
比如:n=4,k=6(k從0開始計數),那麼就是從找第四個數,那麼看規律
(第一隊)
1234
1243
1324
1342
1423
1432
(第二隊)
2134
2143
2314
2341
2413
2431
(第三隊)
。。。。
我們從第一個數字開始確定,由於確定第一個數了,那麼後面的排列組合數是(n-1)!也就是6。問題就是如何確定第一個數,這裡k=6,我們算出 k/n=1,說明這個數在第二隊中。 那麼我們應該把2移到最前面,此時排列就變成了2134。此時問題變為在第二隊中找出第k%n=0個數,由於第一個數已經定了,那麼我們應該在134中找出第0個數。以此類推。
程式碼如下:
//求n的階乘 public int getFactorial(int n){ if(n<0) return 0; else if(n==0) return 1; else return n*getFactorial(n-1); } public String findTheKNum(int n , int k){ int countOfN = getFactorial(n); if(k>countOfN-1||k<0) return null; LinkedList<Integer> list = new LinkedList<Integer>(); for(int i = 1 ; i<=n ; i++){ list.add(i); } for(int exchangeIndex = 0 ; exchangeIndex<list.size()-1 ; exchangeIndex++){ if(k==0) break; int fact = getFactorial(n-exchangeIndex-1); int index = k/fact; k = k%fact; index = index + exchangeIndex; list.add(exchangeIndex, list.get(index)); list.remove(index+1); } StringBuffer strbuf = new StringBuffer(); for(Integer in : list) strbuf.append(in); return strbuf.toString(); }
相關推薦
2014年美團校招之——輸出字典序為第k的排列(0
思路: 比如:n=4,k=6(k從0開始計數),那麼就是從找第四個數,那麼看規律 (第一隊) 1234 1243 1324 1342 1423 1432 (第二隊) 2134 2143 2314 2341 2413 2431 (第三隊)
2014年美團校招之——二維陣列逆時針旋轉45度後列印
思路: 沿著斜線列印即可。 public void print_rotate_matrix(int[] matrix , int n){ if(n<0||matrix==null||matrix.length==0) return; //列
08頭條實習生面試_字典序的第K小數字
LeetCode(440) 字典序的第K小數字 思路: 其實這是一個"十叉樹",如下圖: 1)每個節點的子節點可以有十個,比如節點1的子節點可以是10~19、節點2的位元組的可以是20~29、。。。 但是由於n大小的限制,構成的並不是一個"滿十叉樹"。 2)分
2014年屆校招江蘇銀行蘇州分行,工商銀行蘇州分行,農商行計算機崗面試經驗
先說一下筆試環節,江蘇銀行和工行不分專業,農商行是分專業的。江蘇銀行12月1日面試,工行5號,而農商行的筆試是7日,最後我報考的那家農商行是28號面試,31號給體檢通知的。江蘇銀行的筆試是在南財仙林校區考的,紙質試卷,當天缺考的人非常多,我們考場
2019美團校招一道程式設計題
樣例輸入: 4 20 20 100 60 50 30 80 55 100 60 110 88 5 3 10 6 樣例輸出: 94 分析: 經典01揹包問題參考:https://blog.csdn.net/u011321546/article
最大差值(美團校招真題)
題目描述 有一個長為n的陣列A,求滿足0≤a≤b<n的A[b]-A[a]的最大值。 給定陣列A及它的大小n,請返回最大差值。 測試樣例: [10,5],2 返回:0 實現程式碼
美團校招筆試題
大富翁遊戲(類似於變態跳青蛙問題) #include <iostream> using namespace std; int main() { int n, ans; cin>>n; if(n<0) re
HDU 1385 Minimum Transport Cost (輸出字典序最小路徑)【最短路】
<題目連結> 題目大意:給你一張圖,有n個點,每個點都有需要繳的稅,兩個直接相連點之間的道路也有需要花費的費用。現在進行多次詢問,給定起點和終點,輸出給定起點和終點之間最少花費是多少,並且輸出最少花費所走的路徑,如果有多條路徑花費最少,則輸出字典序最小的那條。 解題分析: 輸出最短路的路徑問
輸出字典序最小的拓撲排序
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> #define
3693 求這串字元中的重複次數最多的連續重複子串,多組答案輸出字典序最小的那個串(字尾陣列)
題目:求這串字元中的重複次數最多的連續重複子串,多組答案輸出字典序最小的那個串。 思路:與前一個題目幾乎一樣的,加上了字典序。多判斷就好 //#include<bits/stdc++.h> #include<iostream> #include
Cocos2d-x 3.4 之 消滅星星 > 第三篇(終) <
周期 ack ini 顏色 博客 ec2 width pri mp3格式 ***************************************轉載請註明出處:http://blog.csdn.net/lttree************************
劍指offer十四之鏈表中倒數第k個結點
gif img https question pla last 代碼 鏈表 || 一、題目 輸入一個鏈表,輸出該鏈表中倒數第k個結點。 二、思路 兩個指針,先讓第一個指針和第二個指針都指向頭結點,然後再讓第一個指正走(k-1)步,到達第k個節點。然後兩個指針同
《劍指offer》---輸出鏈表倒數第k個結點
頭結點 ndk 空間 過程 長度 循環 init find tail 本文算法使用python3實現 1. 問題1 1.1 題目描述: ??輸入一個鏈表,輸出該鏈表中倒數第k個結點。 ??時間限制:1s;空間限制:32768K 1.2 思路描述: ??方法一:當鏈表長度
【劍指offer】輸出鏈表倒數第K個元素
ndk head 判斷 result i++ != == col list 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(
劍指offer刷題之連結串列中倒數第k個結點
題目描述 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # s
劍指offer之連結串列中倒數第K個結點
連結串列中倒數第K個結點 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 思路:使用兩個指標,先讓第一個指標和第二個指標都指向頭結點,然後再讓第一個指正走(k-1)步,到達第k個節點 然後兩個
輸出連結串列倒數第k個結點
問題描述: 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 解題思想: 若連結串列為空或者k為0,則返回的是None。 當連結串列不為空時,有兩種情況: 連結串列長度n<k時,不存在倒數第k個結點,則返回None。 連結串列長度n>k時,設定一個長
[LeetCode] K-th Smallest in Lexicographical Order 字典順序的第K小數字
Given integers n and k, find the lexicographically k-th smallest integer in the range from 1 to n. Note: 1 ≤ k ≤ n ≤ 109. Example: Input: n: 13 k:
牛客網刷題之連結串列中倒數第k個結點
題目描述: 解題思路: 強解法:先遍歷連結串列得出所有節點的個數n,再遍歷一次得到n-k+1節點就是所得到的結果,這一共遍歷了兩次,這基本是不能通過測試的,當然也不會是我們想要的; 看到倒數兩個字有沒有想到棧的先進後出特點,那我們是不是
輸出連結串列倒數第k個數
// ConsoleApplication4.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <stdio.h> #include <stdlib.h> typedef struct MySt