/* 题目描述:给定一个数组,里面有6个整数,求这个数组能够表示的最大24进制的时间是多少,
输出这个时间,无法表示输出invalid。
输入描述:
输入为一个整数数组,数组内有六个整数。输入整数数组长度为6,不需要考虑其它长度,
元素值为0或者正整数,6个数字每个数字只能使用一次。
输出描述:
输出为一个24进制格式的时间,或者字符串"invalid"。
备注:输出时间格式为xx:xx:xx格式。
示例1
输入
[0,2,3,0,5,6]
输出
23:56:00
示例2
输入
[9,9,9,9,9,9]
输出
invalid*/
今天面试的时候给了我这个手撕题,没有写出来。面试没了,痛苦…,还要接着刷题。
我的想法是先解析这个数组为2位-2位-2位的数组,然后将结果存入到一个path中,并把这个path放到一个result数组中。然后对数组进行遍历,取hour,minutes和second的最大值。可惜写不出来,脑袋一团浆糊。下面是ChatGPT给出的我的思路的答案。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution {
public:
string parseTime(vector<int>& nums) {
string res = "invalid";
vector<int> path;
vector<bool> used(6, false);
backtrack(nums, path, used, res);
return res;
}
private:
void backtrack(vector<int>& nums, vector<int>& path, vector<bool>& used, string& res)
{
if(path.size() == 3) {
int h = path[0], m = path[1], s = path[2];
if(h < 24 && m < 60 && s < 60) {
string cur = (h<10?"0":"") + to_string(h) + ":" +
(m<10?"0":"") + to_string(m) + ":" +
(s<10?"0":"") + to_string(s);
if(res == "invalid" || cur > res) res = cur;
}
return;
}
for (int i = 0; i < 6; i++) {
if(used[i]) continue;
used[i] = true;
for (int j = 0; j < 6; j++) {
if(i == j || used[j]) continue;
used[j] = true;
int num = nums[i] * 10 + nums[j];
path.push_back(num);
backtrack(nums, path, used, res);
path.pop_back();
used[j] = false;
}
used[i] = false;
}
}
};
int main() {
Solution sol;
vector<int> nums1 = {0,2,3,0,5,6};
cout << sol.parseTime(nums1) << endl;
vector<int> nums2 = {9,9,9,9,9,9};
cout << sol.parseTime(nums2) << endl;
return 0;
}
直接在typora里写代码,体验不太行~。
over.