給予4組個位數字 排列出最大的時間 時間為24小時制 範圍為00:00 ~ 23:59
假設給予1 2 3 4 輸出應為 23:41 若輸入輸字不合法應進行檢查
先來看一下24小時制的範圍 就可以輕鬆寫出程式了
小時 | 分鐘 | ||
十位數 | 個位數 | 十位數 | 個位數 |
0 | 0-9 | 0-5 | 0-9 |
1 | 0-9 | 0-5 | 0-9 |
2 | 0-3 | 0-5 | 0-9 |
可以看得出來 數組一定要包含0 1 2 其中一種數字才行
且>5的數字只能有2個 這邊可以先將這兩個不符的條件排除
在特別針對小時的十位數等於2時 對小時的個位數進行處理
且>5 的數字只能有1個
程式碼
while (true)
{
List<int> number = new List<int>(); //存放輸入數值
int hourTen = -1; //小時十位數
int hourOne = -1; //小時個位數
int minutesTen = -1; //分鐘十位數
int minutesOne = -1; //分鐘個位數
//塞值並檢查
while (number.Count < 4)
{
string input = Console.ReadLine();
Regex rex = new Regex("^[0-9]$");
if (!rex.IsMatch(input))
{
Console.WriteLine("不合法的數字");
continue;
}
number.Add(Convert.ToInt32(input));
}
//檢查不可能的數組
var greater5Count = number.Where(x => x > 5).Count();
bool check012 = number.Any(x => new List<int>() { 0, 1, 2 }.Contains(x));
if (!check012 || greater5Count > 2)
{
Console.WriteLine("無法產出24小時制時間");
continue;
}
//檢查當小時十位數為2時 是否能組出時間
bool contans2 = number.Contains(2);
//若大於5的數字有2個 勢必不能用2來當作十位數 十位數必須為0或1才行 若沒有0或1 代表無法組合出正確的時間格式
if (contans2 && greater5Count > 1)
{
var less2 = number.Where(x => x <= 1);
if (less2.Count() > 0)
hourTen = less2.Max();
else
{
Console.WriteLine("無法產出24小時制時間");
continue;
}
}
else
{
hourTen = number.Where(x => x <= 2).Max();
number.Remove(hourTen);
}
//當小時十位數字為2時 小時個位數字只能小於4
if (hourTen == 2)
{
var less4 = number.Where(x => x < 4);
if (less4.Count() > 0)
hourOne = less4.Max();
else
{
Console.WriteLine("無法產出24小時制時間");
continue;
}
}
else
{
hourOne = number.Max();
}
number.Remove(hourOne);
//分鐘的十位數必須小於6
minutesTen = number.Where(x => x < 6).Max();
number.Remove(minutesTen);
minutesOne = number.First();
Console.WriteLine($"{hourTen}{hourOne}:{minutesTen}{minutesOne}");
}
輸出結果
題目是解出來了
但是要怎麼測試呢....?
如果直接把0000~9999放進去會有同組數字重複測的問題...
該如何解決呢..?