卡码网用友提前批笔试 | 121 大数减法、122 滑动窗口最大值、117 软件架构

本文主要是介绍卡码网用友提前批笔试 | 121 大数减法、122 滑动窗口最大值、117 软件架构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

121 大数减法

一开始这么写,但是就是有90%的数据通过不了

#include <iostream>
#include <string>
using namespace std;void reverse(string& s,int l, int r) {while (l < r) {char c = s[l];s[l] = s[r];s[r] = c;l++; r--;}
}int main() {string a, b;cin >> a >> b;long long ai = stoi(a);long long bi = stoi(b);string s = "";long int res = ai - bi;int flag = res > 0 ? 1 : 0;if (!flag) res *= -1;while (res) {s += (res % 10 + '0');res /= 10;}reverse(s,0, s.size()-1);if (!flag) s = '-' + s;cout << s << endl;return 0;
}

后来知道会有很多数据甚至超过long long的范围,所以要用字符串模拟减法

代码如下:

#include <iostream>
#include <string>
using namespace std;int main() {string a, b;cin >> a >> b;string flag = "";if (a.size() < b.size()) {string t = a;a = b;b = t;flag = "-";}if (a.size() == b.size()) {for (int i = 0; i < a.size(); i++) {if (a[i] > b[i]) break;else if (a[i] == b[i]) continue;else {string t = a;a = b;b = t;flag = "-";break;}}   }string res = a;int j = a.size() - b.size();for (int i = j; i < a.size(); i++) {if (res[i] >= b[i-j]) res[i] = res[i] - b[i-j] + '0';else {int k = i - 1;while (res[k] < '1') {res[k] = '9'; k--;}res[k] = res[k] - 1;res[i] = (10 - (b[i-j] - res[i]) + '0');}}res = flag + res;cout << res << endl;return 0;
}

122 滑动窗口最大值

本来以为要用最大堆最小堆、优先队列的,但是时间复杂度刚好够用了。需要处理下字符串输入转化为整数数组,由于']'之后还有一个',',需要用一个flag记录状态的变化。其他思路就是一个双重循环控制边界的问题了,小心调试潜在的数组或指针越界的问题就ok了

代码如下:

#include <iostream>
#include <string>
#include <vector>
using namespace std;int main() {string s;getline(cin, s);vector<int> nums;int numE = 0;int k = 0;int flag = 0;for (int i = 0; i < s.size(); i++) {if (s[i] == '=') {numE++;if (numE == 2) {string sk = s.substr(i + 2, s.size() - i - 2);k = stoi(sk);}}if (s[i] == ']') flag = 1;if (flag == 0 && (s[i] == '[' || s[i] == ',')) {int end = i + 1;while (s[end+1] != ',' && s[end + 1] != ']') end++;string snum = s.substr(i+1, end - i);int num = stoi(snum);nums.push_back(num);}}int dif = 0;int maxNum = nums[0];int minNum = nums[0];for (int i = 0; i + k - 1 < nums.size(); i++) {maxNum = nums[i];minNum = nums[i];for (int j = i; j < i + k; j++) {if (maxNum < nums[j]) maxNum = nums[j];if (minNum > nums[j]) minNum = nums[j];}if (dif < maxNum - minNum) dif = maxNum - minNum;}cout << dif << endl;return 0;
}

117 软件架构

原本用set删除功能加以辅助计数,后来发现set.erase删除的是按下标访问的数据,而不是实际数据,map应该也差不多。

改进后代码只能通过30%的测试用例,后面要再改改

#include <iostream>
#include <set>
#include <map>
#include <queue>
#include <stack>
using namespace std;int main() {int n, m;cin >> n >> m;queue<long int> myque;stack<long int> mysta;map<long int, set<long int>> mymap;map<long int, long int> nummap;set<long int> res;int flag = 0;for (int i = 0; i < m; i++) {long int a, b;cin >> a >> b;mymap[b].insert(a);nummap[b]++;}while (res.size() < n) {int num = res.size();for (int i = 0; i < n; i++) {if (res.find(i) == res.end() && nummap[i] == 0) {mysta.push(i);res.insert(i);myque.push(i);}}if (num == res.size()) break;while (!mysta.empty()) {long int t = mysta.top();mysta.pop();for (int i = 0; i < n; i++) {if (res.find(i) == res.end() &&nummap[i] > 0 && mymap[i].find(t) != mymap[i].end())nummap[i]--;}}}if (res.size() < n) cout << -1 << endl;else {while (!myque.empty()) {cout << myque.front() << ' ';myque.pop();}cout << endl;}return 0;
}

这篇关于卡码网用友提前批笔试 | 121 大数减法、122 滑动窗口最大值、117 软件架构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049966

相关文章

uva 10069 DP + 大数加法

代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <cl

使用JS/Jquery获得父窗口的几个方法(笔记)

<pre name="code" class="javascript">取父窗口的元素方法:$(selector, window.parent.document);那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document);如题: $(selector, window.top.document);//获得顶级窗口里面的元素 $(

软件架构模式:5 分钟阅读

原文: https://orkhanscience.medium.com/software-architecture-patterns-5-mins-read-e9e3c8eb47d2 软件架构模式:5 分钟阅读 当有人潜入软件工程世界时,有一天他需要学习软件架构模式的基础知识。当我刚接触编码时,我不知道从哪里获得简要介绍现有架构模式的资源,这样它就不会太详细和混乱,而是非常抽象和易

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

专题二_滑动窗口_算法专题详细总结

目录 滑动窗口,引入: 滑动窗口,本质:就是同向双指针; 1.⻓度最⼩的⼦数组(medium) 1.解析:给我们一个数组nums,要我们找出最小子数组的和==target,首先想到的就是暴力解法 1)暴力: 2)优化,滑动窗口: 1.进窗口 2.出窗口 3.更新值 2.⽆重复字符的最⻓⼦串(medium) 1)仍然是暴力解法: 2)优化: 进窗口:hash[s[rig

新一代车载(E/E)架构下的中央计算载体---HPC软件架构简介

老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节能减排。 无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事.而不是让内心的烦躁、焦虑、毁掉你本就不多的热情和定力。 时间不知不觉中,快要来到夏末秋初。一年又过去了一大半,成

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis

主窗口的设计与开发(二)

主窗口的设计与开发(二) 前言         在上一集当中,我们完成了主窗口的初始化,主窗口包括了左中右三个区域。我们还完成了对左窗口的初始化,左窗口包括了用户头像、会话标签页按钮、好友标签页按钮以及好友申请标签页按钮。对于切换每个标签页,我们还做了初始化信号槽的内容。最后我们将整个MainWidget类设置为单例模式。         那么这一集我们将继续完成主窗口的设计与开发,这一集我

【C++二分查找】2439. 最小化数组中的最大值

本文涉及的基础知识点 C++二分查找 LeetCode2439. 最小化数组中的最大值 给你一个下标从 0 开始的数组 nums ,它含有 n 个非负整数。 每一步操作中,你需要: 选择一个满足 1 <= i < n 的整数 i ,且 nums[i] > 0 。 将 nums[i] 减 1 。 将 nums[i - 1] 加 1 。 你可以对数组执行 任意 次上述操作,请你返回可以得到的 n

两道笔试题

“char a='\72'”是什么意思? 这么理解:\为转义字符,\072转义为一个八进制数072,也就是十进制数的58买一送一,将转义字符对照表也一并贴给你吧:转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) 008 \f 换页(FF) 012 \n 换行(LF) 010 \r 回车(CR) 013 \t 水平制表(HT) 009 \v 垂直制表(VT