牛客周赛 Round 18---携程校招题

第一题

游游的整数翻转

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

游游拿到了一个正整数x,她希望把这个整数的前k位进行翻转。你能帮帮她吗?

输入描述:

两个正整数x和k,用空格隔开。
k保证不超过x的位数。

输出描述:

翻转后的正整数。请注意不要带前导零。

这道可以把他当成字符串去处理,但是当成字符串去处理的时候,你会感觉到前导0的问题

所以还是当成数字处理就行

代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n , k; cin >> n >> k;
    vector<int>vc;
    while(n){
        vc.push_back(n % 10);
        n /= 10;
    }
    int res = 0;
    for(int i = vc.size() - k ; i < vc.size() ; ++ i )res = res * 10 + vc[i];
    for(int i = vc.size() - k - 1 ; i >= 0 ; -- i )res = res * 10 + vc[i];
    cout << res << endl;
    return 0;
}

第二题:

      游游的排列统计---全排列问题

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

游游想知道,有多少个长度为n的排列满足任意两个相邻元素之和都不是素数。你能帮帮她吗?

我们定义,长度为n的排列值一个长度为n的数组,其中1到n每个元素恰好出现了一次。

注意题目给的范围主要是2到10这个范围的左边界是需要注意的,因为他会影响到你判断素数的方法

判断素数的方法:

第一种定义法:

素数的定义:看他是否有除了1和他本身以外的因子

代码如下:你会发现我根据题目所写的方法会自动把n=2的情况报错

                   所以n==2需要另外写出

bool panduan(int a,int b){
    int i;
    for(i=2;i<a+b;i++){
        if((a+b)%i==0)
            break;
    }
    if(i>=a+b) return false;
    else       return true;
}

   对于本题的第二种:

              本题最大的数是10,所以最大的两数之和的最大值就是19(10+9),所以只需要找出1到19的素数就行 2,3,5,7,11,13,17,19就行

全排列:

需要用到c++中的stl中的全排列     next_permutation就会把所有结果全部过一遍,你只需要在每次调用上面所写的判断函数,就行

本题难度不大

代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
bool panduan(int a,int b){
    int i;
    for(i=2;i<a+b;i++){
        if((a+b)%i==0)
            break;
    }
    if(i>=a+b) return false;
    else       return true;
}
int main(){
    int n;
    cin>>n;
    int i;
    int arr[n];
    for(i=0;i<n;i++){
        arr[i]=i+1;
    }
    int count=0;
    if(n==2) cout<<0;
    else{
            do{
            int b=0;
             for(i=1;i<n-1;i++){
               if(panduan(arr[i],arr[i-1]) && panduan(arr[i],arr[i+1])) b++;
             }
                if(b==n-2) count++;
              }while(next_permutation(arr,arr+n));
             cout<<count;
    }

}

第三题:

游游刷题

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网

游游制定了一个刷题计划,她找到了n套试卷,每套试卷的题目数量为ai​。游游每天上午最多打开一套试卷,下午最多打开一套试卷,也可以选择不刷题而摸鱼。当游游打开一套试卷后,她就会把上面的题目全部刷完。但是游游有强迫症,她希望每天刷的题目总数均为k的倍数。请你计算游游最多能刷多少天的题?

思路:

最关键的是你收了n个数据,立马对他取余。

然后用哈希表去储存(map),找到  数值 和target-数值的最小值

代码:

#include<iostream>
#include<map>
using namespace std;

const int N = 1e5 + 5;
int a[N];
int n, k;

int main() {
    cin >> n >> k;
    int ans = 0;
    map<int, int> hash;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        a[i] %= k;
        if (a[i] == 0)
            ans++;
        else
            hash[a[i]]++;
    }
    int res = 0;
    for (auto i : hash)
        res += min(i.second, hash[k - i.first]);
    ans += res / 2;
    cout << ans;
    return 0;
}

 问题:

在这里我突然想到应为我刚开始用的是unordered_map,之后才改成的map

这两者之间的区别

map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。

底层的数据结构就决定了其存储的效率,map的存储效率接近100%,而unordered_map由于哈希函数的缘故,会造成有很多地址没有存储数据,造成了空间的浪费,存储效率低,具体可以看不同的哈希函数的实现,来了解存储效率低的原因

所以用了第一个有可能造成了空间的浪费

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值