华为OD机考C++:基于升高差排序-指定区域单词翻转-最大花费-找对应字符串-数据分类

题目0006基于身高差排序

题目描述:

小明今年升学到了小学一年级,
来到新班级后,发现其他小朋友身高参差不齐,
然后就想基于各小朋友和自己的身高差,对他们进行排序,
请帮他实现排序

输入描述

第一行为正整数 HN
0 < H < 200 为小明的身高
0 < H < 50 为新班级其他小朋友个数
第二行为N个正整数
H1 ~ Hn分别是其他小朋友的身高
取值范围0 < Hi < 200
N个正整数各不相同

输出描述

输出排序结果,各正整数以空格分割
和小明身高差绝对值最小的小朋友排在前面
和小明身高差绝对值最大的小朋友排在后面
如果两个小朋友和小明身高差一样
则个子较小的小朋友排在前面

示例一

  • 输入

    100 10
    95 96 97 98 99 101 102 103 104 105
    
  • 输出

    99 101 98 102 97 103 96 104 95 105
    

C++代码

//
// Created by HANWENKE on 2022/8/28.
//
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> quicsort(vector<int>&arr,int target){
    //计算每一个学生与小明身高差的绝对值
    int diff[arr.size()];
    for(int i=0;i<arr.size();i++){
        diff[i]=abs(arr[i]-target);
    }
    vector<int>temp(arr.size());

    int local;//记录位置
    int x=0;
    for(int j=0;j<arr.size();j++){
        int ss=5000;//记录最小值
        for(int i=0;i<arr.size();i++){
            if(ss>diff[i]){
                ss=diff[i];
                local=i;
            }else if(ss==diff[i]){
                //如果值相等的时候--返回身高小的那个数组下标
                if(arr[i]<arr[local]){
                    local=i;
                }
            }
        }
        temp[x++]=arr[local];
        diff[local]=INT32_MAX;
    }
    return temp;
}
int main(){
    int H,N;
    //身高--学生个数
    cin>>H>>N;
    vector<int>arr(N);
    int temp;
    for(int i=0;i<N;i++){
        cin>>temp;
        arr[i]=temp;
    }
    vector<int>arr1= quicsort(arr,H);
    for(int i=0;i<arr1.size();i++){
        cout<<arr1[i]<<" ";
    }
    return 0;
}

题目0007指定区域单词翻转

题目描述:

输入一个英文文章片段,
翻转指定区域的单词顺序,
标点符号和普通字母一样处理,
例如输入字符串
I am a developer.
[0,3]
则输出
developer. a am I

输入描述

使用换行隔开3个参数
第一个参数为文章内容 即英文字符串
第二个参数为翻转起始单词下标,下标从0开始
第三个参数为结束单词下标

输出描述

翻转后英文文章片段每个单词之间以一个半角空格分割输出

示例一

  • 输入

    I am a developer.
    0
    3
    
  • 输出

    developer. a am I
    

示例二

  • 输入

    hello world!
    0
    3
    
  • 输出

    world! hello
    

C++代码

//
// Created by HANWENKE on 2022/8/28.
//
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
void Reverse(vector<string>&nums,int l,int r){
    //双指针进行翻转
    while(l<r){
        string temp=nums[l];
        nums[l]=nums[r];
        nums[r]=temp;
        l++;
        r--;
    }
}
int main(){
    /*
     * 首先要获取到有几个单词--单词用空格分开--所以可以记录空格的个数
     * 其次在空格的个数上加1就是单词的个数
     * 如果是从0-空格个数就是翻转整个
     */
    vector<string>arr1;
    string ss;
    getline(cin,ss);
    //将字符串用空格分开
    istringstream  s1(ss);
    while(s1>>ss){
        arr1.push_back(ss);
    }
/*    for(int i=0;i<arr1.size();i++){
        cout<<arr1[i]<<" ";
    }*/
    int start,end;
    cin>>start>>end;
    if(end>=arr1.size()){
        end=arr1.size()-1;
    }
    Reverse(arr1,start,end);
    for(int i=0;i<arr1.size();i++)
        cout<<arr1[i]<<" ";
    return 0;
}

题目0008 最大花费

题目描述:

双11众多商品进行打折销售,小明想购买一些自己心仪的商品,
但由于受购买资金限制,所以他决定从众多心意商品中购买3件,
而且想尽可能的花完资金,
现在请你设计一个程序帮助小明计算尽可能花费的最大资金额。

输入描述

第一行为整型数组M,数组长度小于100,数组元素记录单个商品的价格;
单个商品价格小于1000;
第二行输入为购买资金的额度R
R < 100000

输出描述

输出为满足上述条件的最大花费额度
如果不存在满足上述条件的商品请返回-1

示例一

  • 输入

    23,26,36,27
    78
    
  • 输出

    76
    

示例二

  • 输入

    23,30,40
    26
    
  • 输出

    -1
    

C++代码

//
// Created by HANWENKE on 2022/8/28.
//
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
using  namespace  std;
void backtracking(vector<int>&nums,vector<int>&path,int &target,int startindex,int sum,vector<int>&res){
    if(path.size()>3){
        return;
    }
    if(path.size()==3&&sum<=target){
        //不为1的时候只添加最大的
        if(res.size()==1&&sum>res.back()){
            res[0]=sum;
            return;
        }else if(res.size()==0){
            res.push_back(sum);
            return;
        }
        return;
    }
    for(int i=startindex;i<nums.size();i++){
        path.push_back(nums[i]);
        sum+=nums[i];
        backtracking(nums,path,target,i+1,sum,res);
        path.pop_back();
        sum-=nums[i];
    }
}

void solution(vector<int>&nums,int &target){
    sort(nums.begin(),nums.end());
    if(nums.size()<3||
            (nums[0]+nums[1]+nums[2]>target)){
        cout<<-1;
    }
    vector<int>path;
    vector<int>res;
    backtracking(nums,path,target,0,0,res);
    if(res.size()!=0){
        cout<<res[0];
    }else{
        cout<<-1;
    }


}
int main(){
    vector<int>arr1;
    arr1.reserve(100);
    int num;
    while(cin>>num){
        arr1.push_back(num);
        if(getchar()=='\n')break;
    }
    //小明的资金
    cin>>num;
    solution(arr1,num);
    return 0;
}

题目0009 从字符串2中找字符串1的所有字符

题目描述:

给定两个字符串,
从字符串2中找出字符串1中的所有字符,
去重并按照ASCII码值从小到大排列,

输入描述

字符范围满足ASCII编码要求,
输入字符串1长度不超过1024,
字符串2长度不超过100

输出描述

按照ASCII由小到大排序

示例一

  • 输入

    bach
    bbaaccddfg
    
  • 输出

    abc
    

示例二

  • 输入

    fach
    bbaaccedfg
    
  • 输出

    acf
    

C++代码

//
// Created by HANWENKE on 2022/8/28.
//
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <set>
using namespace  std;
int main(){
    string s1,s2;
    cin>>s1;
    cin>>s2;
    //在这里可以使用set集合--将s2放到set当中--遍历s1如果字符存在那么就加入到字符串中
    set<char>use;
    for(int i=0;i<s2.length();i++){
        if(use.end() ==use.find(s2[i])){
            use.insert(s2[i]);
        }
    }
    //ss有可能是重复的--所以要对其去重
    string ss;
    //再用一个set对其去重
    set<char>ss1;
    for(int i=0;i<s1.length();i++){
        if(use.find(s1[i])!=use.end()&&ss1.find(s1[i])==ss1.end()){
            ss+=s1[i];
            ss1.insert(s1[i]);
        }
    }
    //字符串排序
    vector<char>res(ss.length());
    for(int i=0;i<ss.length();i++){
        res[i]=ss[i];
    }
    sort(res.begin(),res.end());
    for(int i=0;i<res.size();i++){
        cout<<res[i];
    }
    return 0;
}

题目0010 数据分类

题目描述:

对一个数据a进行分类,
分类方法是,此数据a(4个字节大小)的4个字节相加对一个给定值b取模,
如果得到的结果小于一个给定的值c则数据a为有效类型,其类型为取模的值。
如果得到的结果大于或者等于c则数据a为无效类型。

比如一个数据a=0x01010101b=3
按照分类方法计算:(0x01+0x01+0x01+0x01)%3=1
所以如果c等于2,则此a就是有效类型,其类型为1
如果c等于1,则此a是无效类型

又比如一个数据a=0x01010103b=3
按分类方法计算:(0x01+0x01+0x01+0x03)%3=0
所以如果c=2则此a就是有效类型 其类型为0
如果c等于0 则此a是无效类型

输入12个数据,
第一个数据为c,第二个数据为b,
剩余10个数据为需要分类的数据

请找到有效类型中包含数据最多的类型,
并输出该类型含有多少个数据

输入描述

输入12个数据用空格分割,
第一个数据为c,第二个数据为b,
剩余10个数据为需要分类的数据。

输出描述

请找到有效类型中包含数据最多的类型,
并输出该类型含有多少个数据。

示例一

  • 输入

    3 4 256 257 258 259 260 261 262 263 264 265
    
  • 输出

    3
    
  • 说明

    这10个数据4个字节相加后的结果分别是
    1 2 3 4 5 6 7 8 9 10
    故对4取模的结果为
    1 2 3 0 1 2 3 0 1 2
    c是3所以012都是有效类型
    类型为1和2的有3个数据
    类型为0和3的只有两个
    

示例二

  • 输入

    1 4 256 257 258 259 260 261 262 263 264 265
    
  • 输出

    2
    

C++代码

//
// Created by HANWENKE on 2022/8/28.
//
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#define byte unsigned char
using namespace std;
bool cmp(const pair<int,int>&a,const pair<int,int>&b){
    return a.second>b.second;
}
class solution{
public:
    void Input(vector<int>&res){
        int x;
        while(cin>>x){
            res.push_back(x);
            if(getchar()=='\n'){ break;}
        }
    }
    //将int转化为byte并且求和输出为int
    int intToBytSum(int x){
        byte bytes[4]={0,0,0,0};
        bytes[0]=(byte)((0xff000000 &x)>>24);
        bytes[1]=(byte)((0xff0000 &x)>>16);
        bytes[2]=(byte)((0xff00 &x)>>8);
        bytes[3]=(byte)((0xff &x));
        int sum=bytes[0]+bytes[1]+bytes[2]+bytes[3];
        return sum;
    }
    //计算4字节相加的结果取模并且将其放到vector中
    vector<int> mod(vector<int>&nums,int c,int mod){
        vector<int>temp;
        for(int i=2;i<nums.size();i++){
            int x=intToBytSum(nums[i])%mod;
            if(x<c){
                temp.push_back(x);
            }
        }
        return temp;
    }
    //在temp--有效数据当中--找数据最多的--并返回其个数
    void Max(vector<int>&temp){
        map<int,int>ismap;
        for(auto &x:temp){
            ismap[x]++;
        }
        vector<pair<int,int>>arr;
        for(auto &x:ismap){
            arr.push_back(x);
        }
        sort(arr.begin(),arr.end(),cmp);
        if(arr.size()!=0){
            cout<< arr[0].second;
            return;
        }
        cout<<0;
        return ;
    }
};
int main(){

    vector<int>res;
    solution l;
    l.Input(res);
    vector<int>path=l.mod(res,res[0],res[1]);
    l.Max(path);
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

HANWEN KE

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

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

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

打赏作者

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

抵扣说明:

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

余额充值