(CareerCup)Find next higher number with same digits

题目地址:http://www.careercup.com/question?id=4869907900530688

Find next higher number with same digits. 
Example 1 : if num = 25468, o/p = 25486 
Example 2 : if num = 21765, o/p = 25167 
Example 3 : If num = 54321, o/p = 54321 (cause it's not possible to gen a higher num than tiz with given digits ).

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace FindNextHigherNumberWithSameDigits
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             Do();
14         }
15 
16         static void Do()
17         {
18             Console.WriteLine("plz input number: ");
19             int input = Convert.ToInt32(Console.ReadLine());
20             var arrayInput = input.ToString().ToCharArray();
21             Find(ref arrayInput);
22             Console.WriteLine("result : " + string.Join("", arrayInput));
23             Do();
24         }
25 
26         static void Find(ref char[] array)
27         {
28             int indexFirst = 0;
29             int indexLast = array.Length - 1;
30             bool hasChanged = false;
31             for (int i = array.Length - 1; i > 0; i--)
32             {
33                 //find the number larger than before one
34                 if (array[i] > array[i - 1])
35                 {
36                     hasChanged = true;
37                     indexLast = i;
38                     indexFirst = i - 1;
39                     //find the number smaller than the number we found 
40                     //and larger than the previous number of the number we found
41                     for (int a = array.Length - 1; a >= i; a--)
42                     {
43 
44                         if (array[a] > array[i - 1] && array[a] < array[i] && array[a] <= array[indexLast])
45                         {
46                             indexLast = a;
47                             indexFirst = i - 1;
48                         }
49                     }
50                     break;
51                 }
52             }
53             //if the number is descending, return .
54             if (!hasChanged) return;
55 
56             var temp = array[indexFirst];
57             array[indexFirst] = array[indexLast];
58             array[indexLast] = temp;
59             //sort the number after previous position
60             Array.Sort(array, indexFirst + 1, array.Length - indexFirst - 1);
61         }
62     }
63 }

 

posted @ 2014-04-03 12:50  鳳梨酥  阅读(264)  评论(0编辑  收藏  举报