第一题
游游的整数翻转
链接:登录—专业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由于哈希函数的缘故,会造成有很多地址没有存储数据,造成了空间的浪费,存储效率低,具体可以看不同的哈希函数的实现,来了解存储效率低的原因
所以用了第一个有可能造成了空间的浪费