第一题
逆时针输出矩阵,剑指offer和leetcode原题
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <algorithm>
#include <map>
using namespace std;
int main() {
string str;
getline(cin, str);
cout << str << endl;
int k = str.size() / 4;
int d = k + 1;
vector<string> res(d, string(d, ' '));
int left = 0, right = k, top = 0, bottom = k, i = 0;
for (int j = 0; j < d; j++) {
res[0][j] = str[i];
i = i + 1;
}
for (int j = 1; j < d; j++) {
res[j][k] = str[i];
i = i + 1;
}
for (int j = d - 2; j >= 0; j--) {
res[d - 1][j] = str[i];
i = i + 1;
}
for (int j = d - 2; j > 0; j--) {
res[j][0] = str[i];
i = i + 1;
}
for (int j = 0; j < d; j++)
cout << res[j] << endl;
cin.get();
}
第二题
和leetcode的一道题很像,先二分输入的数字,再对数字进行generateNum的操作,主要是合并的时候,他不能有重复的两对数字,先考虑的用set<vector<double> > res,但往set里加元素要注意了;也可以用multimap,他是键可以重复的map
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <algorithm>
#include <map>
#include <set>
using namespace std;
vector<double> generateNum(string str) {
vector<double> res;
if (str.empty())
return res;
int num = atoi(str.c_str());
if (str[0] == '0') {
if (str.size() > 1 && num == 0)
return res;
double t = (double)num / pow(10, (str.size() - 1));
res.push_back(t);
}
else {
for (int i = 0; i < str.size(); i++) {
double t = (double)num / pow(10, i);
res.push_back(t);
}
}
return res;
}
int main() {
string str;
getline(cin, str);
int len = str.size();
if (len < 2) return 0;
set<vector<double> > res;
//multimap<double, double> m; // #include <map>
for (int i = 1; i < len; i++) {
vector<double> left = generateNum(str.substr(0, i));
vector<double> right = generateNum(str.substr(i));
cout << "left" << endl;
for (int j = 0; j < left.size(); j++) {
cout << left[j] << endl;
}
cout << "right" << endl;
for (int j = 0; j < right.size(); j++) {
cout << right[j] << endl;
}
for (int j = 0; j < left.size(); j++) {
for (int k = 0; k < right.size(); k++) {
if (left[j] - right[k] > 1e-4)
res.insert({ left[j], right[k] });
//m.insert({ left[j], right[k] });
//m[right[k]] = left[j];
else //m[left[j]] = right[k];
//m.insert({ right[k], left[j]});
res.insert({ right[k], left[j] });
}
//res.insert({ left[j], right[k] });
//cout << m.size() << endl;
}
cout << "m" << endl;
for (auto iter = res.begin(); iter != res.end(); iter++) {
vector<double> t = *iter;
cout << t[0] << " " << t[1] << endl;
}
//for (auto iter = m.begin(); iter != m.end(); iter++) {
// cout << iter->first << " " << iter->second << endl;
//}
}
cout << res.size();
cin.get();
return 0;
}
第三题
思路不难,就是处理输入数据太难,,,,
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <algorithm>
#include <map>
#include <set>
using namespace std;
int main() {
int n, id;
cin >> n >> id; //cin是不会读 /n 的,所以要加 getchar()
getchar();
vector<vector<int> > fri;
for (int i = 0; i < n; i++) {
string str;
getline(cin, str);
vector<int> out;
int j = 0, num = 0;
while (j < str.size()) {
num = 0;
while (j < str.size() && str[j] >= '0' && str[j] <= '9') {
num = num * 10 + (str[j++] - '0');
}
j++;
out.push_back(num);
}
sort(out.begin(), out.end());
fri.push_back(out);
}
vector<int> target = fri[id];
int maxid = 0, maxnum = 0;
for (int i = 0; i < fri.size(); i++) {
if (i == id) continue;
vector<int> out = fri[i];
//if (target.back() < out.front() || out.back() < target.front()) continue;
int cnt = 0, k = 0;
for (int j = 0; j < out.size(); j++) {
if (k < target.size() && out[j] == target[k++])
cnt++;
}
if (maxnum < cnt) {
maxnum = cnt;
maxid = i;
}
}
cout << maxid << endl;
cin.get();
return 0;
}
第四题
原谅我还不会,,,感觉是有点类似于买卖股票第三题那种,然而股票第三题我仍然没搞懂背后原理。。。。坐等大神们的答案