IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 6.经典数据结构与算法题目(一) -> 正文阅读

[数据结构与算法]6.经典数据结构与算法题目(一)

先给一个二叉树节点结构:

class Node2 {
public:
	Node2(int val){
		left = nullptr;
		right = nullptr;
		this->val = val;
	}

	Node2* left;
	Node2* right;
	int val;
};

1.给定一个非负整数n,代表二叉树的节点个数,返回能形成多少种不同的二叉树结构

int test02(int n) {
	if (n < 0) return 0;
	if (n <= 1) return 1;
	if (n == 2) return 2;

	int res = 0;
	for (int i = 0; i < n - 1; i++) {
		int leftNum = test02(i);
		int right = test02(n - 1 - i);
		res += leftNum * right;
	}

	return res;
}

2.完整的字符串需要添加的字符

int test03(string& s) {
	int count = 0;
	int ans = 0;
	for (int i = 0; i < s.size(); i++) {
		if (s[i] == '(') {
			count++;
		}
		else {
			if (count == 0) {
				ans++;
			}
			else {
				count--;
			}
		}
	}
	return count + ans;
}

3.给定一个arr,求差值为k的去重数字对

vector<vector<int>> test04(vector<int>& vec, int k) {
	vector<vector<int>> res;
	unordered_map<int, int> map;
	for (const auto& n : vec) {
		map[n]++;
	}

	for (const auto& n : map) {
		if (map.find(n.first + k) != map.end()) {
			res.push_back(vector<int>{n.first, n.first + k});
		}
		else if (map.find(n.first - k) != map.end()) {
			res.push_back(vector<int>{n.first, n.first - k});
		}
	}

	return res;
}

4.给一个包含n个整数元素的集合a,一个包含m个整数元素的集合b,定义magic操作为,从一个集合中取出一个元素,放到另一个集合中,且操作过后每个集合的平均值都大于操作前。不可以把一个集合的元素区孔,这样就没有平均值了,值为x的元素从集合b取出放入集合a,但集合a中已经有值为x的元素,则a的平均值不变,b的平均值可能会改变,最多进行多少次magic操作。

int test05(vector<int>& a, vector<int>& b) {
	double sum1 = 0;
	for (const auto& n : a) {
		sum1 += n;
	}
	double sum2 = 0;
	for (const auto& n : b) {
		sum2 += n;
	}
	if ((sum1 / a.size()) == (sum2 / a.size())) {
		return 0;
	}
	vector<int> arrMore;
	vector<int> arrLess;
	double sumMore = 0;
	double sumLess = 0;
	if ((sum1 / a.size()) > (sum2 / b.size())) {
		arrMore = a;
		sumMore = sum1;
		arrLess = b;
		sumLess = sum2;
	}
	else {
		arrMore = b;
		sumMore = sum2;
		arrLess = a;
		sumLess = sum1;
	}
	sort(arrMore.begin(), arrMore.end());
	std::set<int> setLess;
	for (const auto& n : arrLess) {
		setLess.insert(n);
	}
	int moreSize = arrMore.size();
	int lessSize = arrLess.size();
	int ops = 0;
	for (int i = 0; i < arrMore.size(); i++) {
		double cur = (double)arrMore[i];
		if (cur < (sumMore / moreSize) && cur >(sumLess / lessSize) && setLess.find(arrMore[i]) != setLess.end()) {
			sumMore -= cur;
			moreSize--;
			sumLess += cur;
			lessSize++;
			setLess.insert(arrMore[i]);
			ops++;
		}
	}
	return ops;
}

5.求一个合法括号字符串的深度,合法字符串的定义“()()()”,合法字符串的深度:"()()()“深度为1”((()))"深度为3

int test06(string& s) {
	if (s.size() == 0) return 0;
	int count = 0;
	int res = 0;
	for (int i = 0; i < s.size(); i++) {
		if (s[i] == '(') {
			count++;
		}
		else {
			count--;
		}
		res = max(count, res);
	}
	return res;
}

6.给定一个合法字符串,找出其有效的最长括号子串长度,"())()(())()))(())"的最长括号子串为“()(())()”

int test07(string& s) {
	if (s.size() == 0) return 0;
	vector<int> dp(s.size());
	int pre = 0, res = 0;
	for (int i = 1; i < s.size(); i++) {
		if (s[i] == ')') {
			pre = i - dp[i - 1] - 1;
			if (pre >= 0 && s[pre] == '(') {
				dp[i] = dp[i - 1] + 2 + (pre > 0 ? dp[pre - 1] : 0);
			}
		}
		res = max(res, dp[i]);
	}
	return res;
}

7.给定一个栈 按升序进行排序 最多只能使用一个额外的栈存放临时数据

void test08(stack<int>& s) {
	stack<int> sta;
	while (!s.empty()) {
		int top = s.top();
		s.pop();
		if (sta.empty() || top < sta.top()) {
			sta.push(top);
		}
		else {
			while (top < sta.top()) {
				int tmp = sta.top();
				sta.pop();
				s.push(tmp);
			}
			sta.push(top);
		}
	}
	s = sta;
}

8.给定一个字符串,1对应a, 2d对应b,…,26对应z,例如12258可以转化为"abbeh", “aveh”,“abyh”,“lbeh”,“lyh”,给出可以转化的不同字符串的个数

int test09_1(string s, int n) {
	if (n == s.size()) {
		return 1;
	}

	if (s[n] == '0') {
		return 0;
	}
	int res = test09_1(s, n + 1);
	if (n == s.size() - 1) {
		return res;
	}
	if (((s[n] - '0') * 10 + s[n + 1] - '0') < 27) {
		res += test09_1(s, n + 2);
	}
	return res;
}

9.二叉树每个节点都有一个权重,求一颗二叉树从根到叶子的所有路径中权重和最大的一条路

int max10 = INT_MIN;
void test10(Node2* head, int pre) {
	if (head->left == nullptr && head->right == nullptr) {
		max10 = max(max10, pre + head->val);
	}
	if (head->left) {
		test10(head->left, pre + head->val);
	}
	if (head->right) {
		test10(head->right, pre + head->val);
	}
}

10.查找二维数组中的一个数字,该二维数组中数字每行每列都是有序的从小到大

bool test11(vector<vector<int>> vec, int num) {
	int left = 0;
	int right = vec[0].size();
	while (left < vec.size() && right >= 0) {
		if (vec[left][right] == num) return true;
		if (vec[left][right] > num) {
			right--;
		}
		else {
			++left;
		}
	}
	return false;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:44:27  更:2022-05-05 11:49:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:50:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码