6016. Excel 表中某个范围内的单元格

​题目链接​

题意

【力扣·周赛】第 283 场周赛(C++)_数组

思路

模拟就可,要注意第一层循环的是字母,第二层循环的是数字,范围就是题目里给出字符串的第一个和第二个单元格的范围。每次将组合后的答案保存到vector里。

代码

class Solution {
public:
vector<string> cellsInRange(string s) {
vector<string>ans;
for(int j=s[0]-'A';j<=s[3]-'A';j++){
for(int i=s[1]-'0';i<=s[4]-'0';i++){

string now="";
char t=(j+'A');
now=now+t;
t=(i+'0');
now=now+t;
ans.push_back(now);
}
}
return ans;
}
};

6017. 向数组中追加 K 个整数

题意

给你一个整数数组 nums 和一个整数 k 。请你向 nums 中追加 k 个 未 出现在 nums 中的、互不相同 的 正 整数,并使结果数组的元素和 最小 。
返回追加到 nums 中的 k 个整数之和。

思路

基本思路就是判判断当前数跟前一个数中间有多少个数,能加小的先加小的。
对于第一个数,跟1比较。
如果遍历完所有的数,还没有加够k个数的话,就从最后开始继续加。
求和的话用等差数列求和公式。
写麻烦了的垃圾代码。

代码

class Solution {
public:
long long minimalKSum(vector<int>& nums, int k) {
long long ans=0;
sort(nums.begin(),nums.end());
int n=nums.size()-1;
/*for(int i=0;i<=n;i++){
cout<<i<<"==="<<nums[i]<<endl;
}*/
for(int i=0;i<nums.size();i++){
long long sum=0;
int tmp;
if(i==0){
if(nums[i]!=1){
///5
//1 2 3 4
tmp=nums[i]-1;
if(k>=tmp){
k-=tmp;
sum=1ll*tmp*(1+tmp)/2;
ans=ans+sum;
}
else{
tmp=k;
sum=1ll*tmp*(1+tmp)/2;
ans=ans+sum;
k=0;
}
}
}
else{
if(nums[i]!=nums[i-1]+1&&nums[i]!=nums[i-1]){
tmp=nums[i]-nums[i-1]-1;
///3 6
// 4 5
if(k>=tmp){
k-=tmp;
sum=1ll*tmp*(nums[i-1]+1+nums[i]-1)/2;
ans+=sum;
}
else{
tmp=k;
sum=1ll*tmp*(nums[i-1]+1+nums[i-1]+1+tmp-1)/2;
ans+=sum;
k=0;
}
}
}
if(k==0) break;
// cout<<i<<" "<<nums[i]<<" "<<tmp<<" "<<sum<<endl;
}
if(k>0){
long long sum=1ll*k*(nums[n]+1+k-1+nums[n]+1)/2;
ans=ans+sum;
}
return ans;
}
};

6018. 根据描述创建二叉树

题意

【力扣·周赛】第 283 场周赛(C++)_数组_02

思路

首先找到根,根就是当过父亲节点,没有当过子节点的。所以先遍历一遍,存储父亲节点跟子节点是否出现过。
在遍历的过程中,同时存储每个节点的子节点。我用的是vector套pair保存的,所以用哈希离散化了下值,方便保存。
然后dfs进行构造,从根节点开始构造,构造的时候判断是否有左右子节点,然后递归构造。

代码

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<pair<int,int>>>v;
map<int,int>mp;
unordered_map<int,bool>parent;
unordered_map<int,bool>child;
TreeNode* dfs(vector<vector<int>>& descriptions,int root){
TreeNode* res=new TreeNode(root);
if(mp.find(root)==mp.end()){
return res;
}
int u=mp[root];
int siz=v[u].size();
if(siz!=0){
for(pair<int,int>t2:v[u]){
int cc=t2.first,ll=t2.second;
if(ll==1){
res->left=dfs(descriptions,cc);
}
else{
res->right=dfs(descriptions,cc);
}
}
}
return res;
}
TreeNode* createBinaryTree(vector<vector<int>>& descriptions) {
int n=descriptions.size();
parent.clear();
child.clear();
for(int i=0;i<n;i++){
vector<pair<int,int>>tmp;
v.push_back(tmp);
}
for(int i=0;i<n;i++){
vector<pair<int,int>>tmp;
int pp=descriptions[i][0];
int cc=descriptions[i][1];
int ll=descriptions[i][2];
if(mp.find(pp)==mp.end()){
mp[pp]=i;
// cout<<pp<<"***"<<i<<endl;
tmp.push_back({cc,ll});
v[i]=tmp;
parent[pp]=true;
child[cc]=true;
}
else{
int tt=mp[pp];
// cout<<pp<<"***"<<tt<<endl;
tmp=v[tt];
tmp.push_back({cc,ll});
v[tt]=tmp;
parent[pp]=true;
child[cc]=true;
}

}
/* for(int i=0;i<n;i++){
for(pair<int,int>t:v[i]){
cout<<i<<" "<<t.first<<" "<<t.second<<endl;
}
}*/
int root=0;
for(auto it:parent){
int val=it.first;
if(child.find(val)==child.end()){
root=val;break;
}
}
// cout<<root<<endl;
TreeNode* ans=dfs(descriptions,root);
return ans;
}
};
/*
[50,20,80,15,17,19]
*/

6019. 替换数组中的非互质数

题意

【力扣·周赛】第 283 场周赛(C++)_i++_03

思路

每次替换都相当于减少一个数,然后暴力维护一下就行了,时间复杂度O(n)
具体地,维护答案vector,遍历一遍数组,然后不断地判断vector的最后一个数和当前数是否互质,不互质的话就令当前数等于lcm,并且将vector的最后一个数弹出。最后将当前数放入vector里。

代码

class Solution {
public:
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int lcm(int x,int y){
return x/gcd(x,y)*y;
}
vector<int> replaceNonCoprimes(vector<int>& nums) {
vector<int>ans;
for(int i=0;i<nums.size();i++){
int t=nums[i];
while(!ans.empty()){
int now=ans.back();
if(gcd(t,now)>1){
int sum=lcm(t,now);
ans.pop_back();
t=sum;
}
else break;
}
ans.push_back(t);
}
return ans;
}
};