Project Euler
Problem 24(Lexicographic permutations)
(이경수)
2019. 4. 22. 20:15
Problem 24(Lexicographic permutations)
A permutation is an ordered arrangement of objects. For example, 3124 is one possible permutation of the digits 1, 2, 3 and 4. If all of the permutations are listed numerically or alphabetically, we call it lexicographic order. The lexicographic permutations of 0, 1 and 2 are:
012 021 102 120 201 210
What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9?
In Python:
import time
def swap(s, i, j):
nList = list(s)
nList[j], nList[i] = nList[i], nList[j]
return ''.join(nList)
def undersort(s, i):
nList = list(s)
nList1 = nList[0: i]
nList2 = nList[i:]
nList2.sort()
nList = nList1 + nList2
return ''.join(nList)
def lexico(nStr):
maxIdx = len(nStr) - 1
for i in range(maxIdx - 1, -1, -1):
for j in range(maxIdx, i, -1):
if int(nStr[i]) < int(nStr[j]):
nStr = swap(nStr, i, j)
nStr = undersort(nStr, i + 1)
return nStr
startTime = time.time()
nStr = '0123456789'
for i in range(pow(10, 6) - 1):
nStr = lexico(nStr)
print(nStr)
print(time.time() - startTime, "seconds")
Run time: 4.184289216995239 seconds
In Java:
//Euler24 Lexicographic permutations
package project_euler21_30;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
public class Euler24 {
public static String swap(String s, int i, int j) {
String nStr = "";
String data[];
ArrayList<String> dataList = new ArrayList<String>();
data = s.split("");
for (int k = 0; k < data.length; k++) {
dataList.add(data[k]);
}
Collections.swap(dataList, i, j);
for (int k = 0; k < dataList.size(); k++) {
nStr += dataList.get(k);
}
return nStr;
}
public static String undersort(String s, int i) {
String nStr = "";
String data[];
ArrayList<String> dataList = new ArrayList<String>();
data = s.split("");
for (int k = 0; k < data.length; k++) {
dataList.add(data[k]);
}
List<String> dataList1 = dataList.subList(0, i);
List<String> dataList2 = dataList.subList(i, dataList.size());
Collections.sort(dataList2);
dataList1.addAll(dataList2);
for (int k = 0; k < dataList1.size(); k++) {
nStr += dataList1.get(k);
}
return nStr;
}
public static String lexico(String s) {
String nStr ="";
int maxIdx = s.length() - 1;
for (int i = maxIdx - 1; i > -1; i--) {
for (int j = maxIdx; j > i; j--) {
if (Integer.parseInt("" + s.charAt(i)) < Integer.parseInt("" + s.charAt(j))) {
nStr = swap(s, i, j);
nStr = undersort(nStr, i + 1);
return nStr;
}
}
}
return nStr;
}
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
String nStr = "0123456789";
for (int i = 0; i < Math.pow(10, 6) - 1; i++) {
nStr = lexico(nStr);
}
System.out.println(nStr);
long endTime = System.currentTimeMillis();
System.out.println((double)(endTime - startTime)/(double)1000 + "seconds");
}
}
Run time: 3.929seconds
Solution: 2783915460