很有意思的一道題目,有幾種不同的思路。
首先我自己的思路:把每一種permutation都列舉出來(用到了之前自己不太理解的swap的方法,還挺好用的),如果符合時間要求,就轉化爲string,然後保存最大的一個:
class Solution {
public:
string largestTimeFromDigits(vector<int>& A) {
string maxTime = "";
dfs(A, 0, maxTime);
return maxTime.empty() ? maxTime : maxTime.substr(0, 2) + ":" + maxTime.substr(2, 2);
}
private:
stringstream ss;
void dfs(vector<int>& A, int idx, string& maxTime) {
if (idx == A.size()) {
if (isValid(A)) {
string time = nums2Str(A);
maxTime = max(time, maxTime);
}
}
for (int i = idx; i < A.size(); ++i) {//每一層,把之後的每一個數字都放到這個位置試一試
swap(A[idx], A[i]);
dfs(A, idx+1, maxTime);
swap(A[idx], A[i]);
}
}
bool isValid(vector<int>& nums) {
if (nums[0] > 2)
return false;
if ((nums[0] == 2 && !(nums[1] > 3)) || (nums[0] < 2)) {
if (nums[2] <= 5)
return true;
}
return false;
}
string nums2Str(vector<int>& nums) {
ss.str("");
for (int num : nums)
ss << num;
return ss.str();
}
};
思路很清楚,但是代碼比較繁瑣。
方法二:
評論區的代碼,真的暴力。。。
public String largestTimeFromDigits(int[] A) {
String ans = "";
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
for (int k = 0; k < 4; ++k) {
if (i == j || i == k || j == k) continue; // avoid duplicate among i, j & k.
String h = "" + A[i] + A[j], m = "" + A[k] + A[6 - i - j - k], t = h + ":" + m; // hour, minutes, & time.
if (h.compareTo("24") < 0 && m.compareTo("60") < 0 && ans.compareTo(t) < 0) ans = t; // hour < 24; minute < 60; update result.
}
}
}
return ans;
}
所以說這裏也是暴力枚舉出每一種情況,只不過這裏因爲只有4個元素,所以直接使用循環來枚舉出來就行了。也記住這樣的思路吧。