重建二叉树
原题链接
解题思路:
已知先序和中序或者已知中序和后序,都是利用先序的序列的第一个元素为根,后序序列的最后一个元素为根,在中序序列中划分出相应的左子树和右子树,依此继续。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
//int prenum=0,innum=0;
//不能使用感觉上的方式!!!而是应该根据手动实现的方法
map<int ,int> lot;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
for(int i=0;i<inorder.size();i++){
lot[inorder[i]]=i;
}
build(preorder,inorder,0,preorder.size()-1,0,inorder.size()-1);
}
TreeNode* build(vector<int>& preorder, vector<int>& inorder,int pl,int pr,int il,int ir){
if(pl>pr) return NULL;
TreeNode *T=new TreeNode(preorder[pl]);
int k=lot[preorder[pl]]-il;
T->left=build(preorder,inorder,pl+1,pl+k,il,il+k-1);
T->right=build(preorder,inorder,pl+k+1,pr,il+k+1,ir);
return T;
}
};
字符画
原题链接
处理输入
计算均值,如何决定何时添加换行
颜色的转变
数值和asc码的转变
#include<iostream>
#include<string.h>
#include<map>
using namespace std;
#define MNAX 1500
int m, n, p, q;
//int block[MNAX][MNAX][3];
int avg[MNAX][MNAX][3];
int R = 0, G = 0, B = 0;
map<char, int > six;
void init() {
for (int i = 0; i <= 9; i++) six['0' + i] = i;
for (int i = 0; i <= 6; i++) six['a' + i] = 10 + i;
}
void read(string s, int i, int j) {
int b1, b2, b3;
if (s.size() == 7) {
b1 = six[s[1]] * 16 + six[s[2]];
b2 = six[s[3]] * 16 + six[s[4]];
b3 = six[s[5]] * 16 + six[s[6]];
}
else if (s.size() == 2) {
b1 = b2 = b3 = six[s[1]] * 16 + six[s[1]];
}
else {
b1 = six[s[1]] * 16 + six[s[1]];
b2 = six[s[2]] * 16 + six[s[2]];
b3 = six[s[3]] * 16 + six[s[3]];
}
avg[i / q][j / p][0] += b1;
avg[i / q][j / p][1] += b2;
avg[i / q][j / p][2] += b3;
}
string change(int r, int g, int b) {
string res = "\\x1B\\x5B\\x34\\x38\\x3B\\x32\\x3B";
for (int j = 0; j < 3; j++) {
int value;
if (j == 0) value = r;
else if (j == 1) value = g;
else value = b;
int key = 0;
for (int i = 100; i; i /= 10) {
if (value / i || key) {
key = 1;
char c = '0' + value / i;
res += "\\x3";
res += c;
}
value %= i;
}
if (!key) res += "\\x30";
if (j != 2)res += "\\x3B";
else res += "\\x6D";
}
return res;
}
int main() {
init();
cin >> m >> n >> p >> q;
memset(avg, 0, sizeof(avg));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
string s;
cin >> s;
read(s, i, j);
}
}
/*for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) printf("# %d %d %d #", b1, b2, b3);
cout << endl;
}*/
for (int i = 0; i < n / q; i++) {
for (int j = 0; j < m / p; j++) {
avg[i][j][0] /= p * q;
avg[i][j][1] /= p * q;
avg[i][j][2] /= p * q;
}
}
/*for (int i = 0; i < n / q; i++) {
for (int j = 0; j < m / p; j++) printf("# %d %d %d #", avg[i][j][0], avg[i][j][1], avg[i][j][2]);
cout << endl;
}*/
string res = "";
for (int i = 0; i < n / q; i++) {
for (int j = 0; j < m / p; j++) {
if (avg[i][j][0] != R || avg[i][j][1] != G || avg[i][j][2] != B) {
if (avg[i][j][0] != 0 || avg[i][j][1] != 0 || avg[i][j][2] != 0)res += change(avg[i][j][0], avg[i][j][1], avg[i][j][2]);
else {
res += "\\x1B\\x5B\\x30\\x6D";//变为背景色
}
}
res += "\\x20";
R = avg[i][j][0], G = avg[i][j][1], B = avg[i][j][2];
}
//if (i == n / q - 1) {
if (R != 0 || B != 0 || G != 0) res += "\\x1B\\x5B\\x30\\x6D";
R = B = G = 0;
//}
res += "\\x0A";
}
cout << res;
}
tip:
1.初始值应该为0 0 0
2.每一行都要初始化
3.关于数字转化为字符串注意key的使用和value值为0的判断
谨此纪念我逝去的两个半小时