算法刷题记录(Day 63)

重建二叉树

原题链接
解题思路:
已知先序和中序或者已知中序和后序,都是利用先序的序列的第一个元素为根,后序序列的最后一个元素为根,在中序序列中划分出相应的左子树和右子树,依此继续。

/**
 * 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的判断

谨此纪念我逝去的两个半小时
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值