华为OD机考:0025-0028:黑板报数字涂色-十进制数字最低位排序-最大n个数和最小n个数之和

0025-数组中和最小的-数字对以及和

题目描述:

输入n个数–求这n个数中,和的绝对值最小的数字以及其对应的和

样例:

输入
-1 -3 7 5 11 15
输出
 -3 5 2

C++代码

//
// Created by HANWENKE on 2022/9/6.
//
#include <iostream>
#include <vector>
#include <sstream>
using namespace  std;
int main(){
    string ss;
    getline(cin,ss);
    istringstream  s1(ss);
    int temp;
    vector<int>arr1;
    while(s1>>temp){
        arr1.push_back(temp);
    }
    int min=INT32_MAX;
    int a=0;
    int b=0;
    for(int i=0;i<arr1.size();i++){
        for(int j=0;j<arr1.size();j++){
             int sum=arr1[i]+arr1[j];
             if(sum<0)
                 sum=-sum;
            if(i!=j&&sum<min){
                a=arr1[i];
                b=arr1[j];
                min=sum;
            }
        }
    }
    cout<<a<<" "<<b<<" "<<min;
    return 0;
}

0026-黑板报数字涂色

题目描述:

疫情过后希望小学终于又重新开学了
3年2班开学第一天的任务是
将后面的黑板报重新制作
黑板上已经写上了N个正整数
同学们需要给这每个数分别上一种颜色
为了让黑板报既美观又有学习意义
老师要求同种颜色的所有数都可以被这个颜色中最小的那个数整除
现在帮小朋友们算算最少需要多少种颜色,给这N个数进行上色

输入输出描述

    输入描述
        第一行有一个正整数N
        其中 1 <= n <=100
        第二行有N个int型数,保证输入数据在[1,100]范围中
        表示黑板上各个正整数的值

     输出描述
     输出只有一个整数,为最少需要的颜色种数

样例


输入
    3
    2 4 6
输出
    1
 说明:
    所有数都能被2整除

 输入
    4
    2 3 4 9
 输出
    2
 说明:
    24涂一种颜色,4能被2整除
    39涂另一种颜色,9能被3整除
    不能涂同一种颜色

C++代码

//
// Created by HANWENKE on 2022/9/6.
//
#include <iostream>
#include <vector>
#include <algorithm>
using namespace  std;
int main(){
    int n;
    cin>>n;
    vector<int>arr1;
    arr1.reserve(n);
    int temp;
    for(int i=0;i<n;i++){
        cin>>temp;
        arr1.push_back(temp);
    }
    sort(arr1.begin(),arr1.end());
    int res=0;
    for(int i=0;i<arr1.size();i++){
        res++;
        for(int j=i+1;j<arr1.size();){
            //如果后面数字是前面数字的倍数--之间删除这个元素
            if(arr1[j]%arr1[i]==0){
                arr1.erase(arr1.begin()+j);
            }else{
                j++;
            }
        }
    }
    cout<<res;
    return 0;
}

0027-十进制数字最低位排序

题目描述:

​ 给定一个非空数组(列表)
​ 起元素数据类型为整型
​ 请按照数组元素十进制最低位从小到大进行排序
​ 十进制最低位相同的元素,相对位置保持不变
​ 当数组元素为负值时,十进制最低为等同于去除符号位后对应十进制值最低位

输入:输出描述


 输入描述
     给定一个非空数组(列表)
     其元素数据类型为32位有符号整数
     数组长度为[1,1000]
     输出排序后的数组

     输入
     1,2,5,-21,22,11,55,-101,42,8,7,32
     输出
     1,-21,11,-101,2,22,42,32,5,55,7,8

C++代码

//
// Created by HANWENKE on 2022/9/6.
//
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace  std;
bool cmp(pair<int,int>&a,pair<int,int>&b){
    if(a.first<b.first){
        return true;
    }else if(a.first==b.first&&a.second<b.second){
        return true;
    }
    return false;
}
int main(){
    vector<int>arr1;
    int temp=0;
    while(1){
        cin>>temp;
        arr1.push_back(temp);
        if(getchar()=='\n')break;
    }
    //排序要求--最后一个数字的大小,如果数字大小相同的时候,按照输入顺序排序--
    //所以需要记录输入的顺序--以及最后一个数字
    unordered_map<int,int>ismap;
    vector<pair<int,int>>arr2(arr1.size());
    for(int i=0;i<arr1.size();i++){
        //将数字转化位字符串
        string ss= to_string(arr1[i]);
        //获取字符串的最后一个字符
        char c=ss[ss.length()-1];
        //用字符减去数字0转为位数字
         temp= c-'0';
        //first保存最后一位数,second,保存位置
        arr2[i].first=temp;
        arr2[i].second=i+1;
        //用无序map来记录数字--最后用于数字的输出
        ismap[i+1]=arr1[i];
    }
    sort(arr2.begin(),arr2.end(),cmp);
    for(int i=0;i<arr2.size();i++){
        cout<<ismap[arr2[i].second]<<" ";
    }
    return 0;
}

0028-最大n个数和最小n个数之和

题目描述

​ 给定一个数组
​ 编写一个函数
​ 来计算他的最大N个数和最小N个数的和
​ 需要对数组进行去重

说明

说明
第一行输入M
M表示数组大小
第二行输入M个数
表示数组内容
第三行输入N表示需要计算的最大最小N的个数

输出输出说明

 例一:
 输入
     5
     95 88 83 64 100
     2

输出
	342

说明
    最大2个数[100 95] 最小2个数[83 64]
    输出342

例二
输入
    5
    3 2 3 4 2
    2

输出
	-1
说明
最大两个数是[4 3]最小2个数是[3 2]
有重叠输出为-1

C++代码

//
// Created by HANWENKE on 2022/9/6.
//
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    int n;
    cin>>n;
    vector<int>arr1(n);
    int temp=0;
    for(int i=0;i<n;i++){
        cin>>temp;
        arr1[i]=temp;
    }
    int count=0;
    cin>>count;
    sort(arr1.begin(),arr1.end());
    //将不重复的元素移动到前面来
    auto newsize= unique(arr1.begin(),arr1.end());
    //删除重复的元素
    arr1.erase(newsize,arr1.end());
    //如果元素的个数大于元素个数的一半,那么肯定有重叠--直接返回-1
    if(count>arr1.size()/2){
        cout<<-1;
        return 0;
    }
	int res=0;
    for(int i=0,j=arr1.size()-1;i<j;i++,j--){
        res+=arr1[i];
        res+=arr1[j];
    }
    cout<<res;
    return 0;
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HANWEN KE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值