นั่นเป็นคำถามที่น่าสนใจมาก
นี่คือเวอร์ชัน Java ของฉัน ใช้เวลาประมาณ 3 ชั่วโมงในการหารูปแบบเพื่อเสร็จสิ้นโค้ดให้สมบูรณ์ก่อนที่ฉันจะตรวจสอบความคิดเห็นของผู้มีส่วนร่วมคนอื่น ดีใจที่ได้เห็นความคิดของฉันค่อนข้างเหมือนกันกับคนอื่น ๆ
โซลูชัน O (n) สุจริตฉันจะล้มเหลวในการสัมภาษณ์ครั้งนี้หากเวลาเพียง 15 นาทีและต้องใช้รหัสเสร็จบนกระดานไวท์บอร์ด
นี่คือบางจุดที่น่าสนใจสำหรับการแก้ปัญหาของฉัน:
- หลีกเลี่ยงการเรียงลำดับใด ๆ
- หลีกเลี่ยงการดำเนินการกับสตริงอย่างสมบูรณ์
- บรรลุความซับซ้อนของพื้นที่ O (logN)
ฉันใส่ความคิดเห็นอย่างละเอียดในรหัสของฉันและ Big O ในแต่ละขั้นตอน
public int findNextBiggestNumber(int input ) {
//take 1358642 as input for example.
//Step 1: split the whole number to a list for individual digital 1358642->[2,4,6,8,5,3,1]
// this step is O(n)
int digitalLevel=input;
List<Integer> orgNumbersList=new ArrayList<Integer>() ;
do {
Integer nInt = new Integer(digitalLevel % 10);
orgNumbersList.add(nInt);
digitalLevel=(int) (digitalLevel/10 ) ;
} while( digitalLevel >0) ;
int len= orgNumbersList.size();
int [] orgNumbers=new int[len] ;
for(int i=0;i<len;i++){
orgNumbers[i ] = orgNumbersList.get(i).intValue();
}
//step 2 find the first digital less than the digital right to it
// this step is O(n)
int firstLessPointer=1;
while(firstLessPointer<len&&(orgNumbers[firstLessPointer]>orgNumbers[ firstLessPointer-1 ])){
firstLessPointer++;
}
if(firstLessPointer==len-1&&orgNumbers[len-1]>=orgNumbers[len-2]){
//all number is in sorted order like 4321, no answer for it, return original
return input;
}
//when step 2 step finished, firstLessPointer pointing to number 5
//step 3 fristLessPointer found, need to find to first number less than it from low digital in the number
//This step is O(n)
int justBiggerPointer= 0 ;
while(justBiggerPointer<firstLessPointer&& orgNumbers[justBiggerPointer]<orgNumbers[firstLessPointer]){
justBiggerPointer++;
}
//when step 3 finished, justBiggerPointer pointing to 6
//step 4 swap the elements of justBiggerPointer and firstLessPointer .
// This is O(1) operation for swap
int tmp= orgNumbers[firstLessPointer] ;
orgNumbers[firstLessPointer]= orgNumbers[justBiggerPointer] ;
orgNumbers[justBiggerPointer]=tmp ;
// when step 4 finished, the list looks like [2,4,5,8,6,3,1] the digital in the list before
// firstLessPointer is already sorted in our previous operation
// we can return result from this list but in a differrent way
int result=0;
int i=0;
int lowPointer=firstLessPointer;
//the following pick number from list from the position just before firstLessPointer, here is 8 -> 5 -> 4 -> 2
//This Operation is O(n)
while(lowPointer>0) {
result+= orgNumbers[--lowPointer]* Math.pow(10,i);
i++;
}
//the following pick number from list from position firstLessPointer
//This Operation is O(n)
while(firstLessPointer<len) {
result+= orgNumbers[firstLessPointer++ ]* Math.pow(10,i);
i++;
}
return result;
}
นี่คือผลลัพธ์ที่ทำงานใน Intellj:
959879532-->959892357
1358642-->1362458
1234567-->1234576
77654321-->77654321
38276-->38627
47-->74