在这部分,我会带着你徜徉在c/c++的世界里,让你感受到开发的乐趣以及知识的力量。助君秋招通关。
言归正传。
让我们开始学习吧。
1.基本框架
#include<bits/stdc++.h>
using namespace std;
int main(){
return 0;
}
这里是一个最简单的例子
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
printf("hello world\n");
printf("%d\n",123);
return 0;
}
输出:
在这里我要特别强调的是:
(1)#include<bits/stdc++.h>
using namespace std;
这两行是调用c++语言已经定义好的库,也就是功能模块。
(2)在主函数main()模块,定义形式为void mian()表示结果无返回值(无return 0;这行);int main()表示有返回值,这个细节要注意。
(3)在笔试中,输出结果如果没有特殊要求,一定要加换行。如printf("%d\n",123);
(4)在笔试过程中,代码一般也会看时间复杂度和空间复杂度,一定要注重小细节,按题目要求的输出格式进行输出。
2.字符类型
No. | 类型 | 变量 | 输出 | 输入 |
---|---|---|---|---|
1 | 整型 | int n = 0; |
printf("%d\n",n); |
scanf("%d",&n); |
2 | 单精度浮点型 | float f = 0; |
printf("%f\n",f); |
scanf("%f",&f); |
3 | 字符串 | string s; |
cout << s << "\n";/s.c_str(); |
cin >>s; |
4 | 字符 | char c; |
printf("%c",c); |
scanf("%c",&c) |
5 | 长整型 | long long l; |
printf("%ldd",l); |
printf("%lld",&l); |
注意:变量名只能含有英文字母和下划线组成,不能含有数字及特殊字符。
小数精确度处理:%.精确度f
我们这里给出一个例子:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a=123;
float b=1.22222222;
float c=1.33;
string s="123344";
printf("%d\n",a);
printf("%f\n",b);
printf("%.2f\n",c);
printf("%f\n",c);
printf("%s\n",s.c_str());
return 0;
}
输出:
注意:
(1)各类型输出要对应相应的输出格式,整型:%d, 浮点型:%f, 长整型:%ld, 字符:%c, 字符串:%s。
在对字符串进行输出时,printf("%s\n",s);为错误输出格式,一定要注意,这里有两种方法:要么使用cout<<s<<\n;输出,要么 使用函数s.c_str()进行输出。
(2)各类型都有自己数值的默认范围及默认精度,例如%f的默认输出精度为小数点后六位。类型间可进行强制类型转换。
(3)当有特殊精度要求时,要在输出格式特殊说明:%数字.数字f。
(4)整数除法说明:整数除以整数还是整数,如果结果需要是小数,要乘以1.0。例如:3/2的结果为1,1.0*3/2的结果为1.5。
知道了这些后,给出一个简单例子,大家自行理解:
在代码中,中文出现只有两种结果:一是出现在字符串中,二是出现在注释中。
字符串最简单的输入输出方式:
下面我们开始对秋招题目进行详细的解答:
(1)网易2018秋-------------字符串碎片(点击文字进入链接)
题目解析
字符串统计
如何手动计算字符串碎片?
每次比较第一个字符与前一个字符是否相等,如果相等视为同一个碎片,反之,视为不同碎片。
字符串 | a | a | a | b | b | a | a | a | c |
---|---|---|---|---|---|---|---|---|---|
碎片个数 | 1 | 1 | 1 | 2 | 2 | 3 | 3 | 3 | 4 |
碎片总长度 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
参考答案
#include <bits/stdc++.h>
using namespace std;
int main() {
string str;
cin >> str;
char prev = str[0];//char表示一个字符
int count = 1;//碎片个数
for(int i = 1; i != str.size(); i++) { //从第二个字符开始比较
if(prev != str[i]) { //当前字符与前一个字符不相等
prev = str[i];
count++; //开始一个新的碎片
}
}
printf("%.2f\n", 1.0*str.size() / count);//输出结果为保留两位数的小数
return 0;
}
本题知识点:
- 字符串变量
string s;
- 获取字符串长度
s.size()
- 获取字符串
i
位置字符s[i]
- 遍历字符串
for(int i=0;i<s.size();++i){
printf("%c",s[i]);
}
(2)网易2018秋------------ 重排数列(点击文字进入链接)
题目解析
从最简单情况分析
数列数字个数 | 可能情况 |
---|---|
1 | 4的倍数/奇数/不能被4整除的偶数 |
2 | 4的倍数×奇数/不能被4整除的偶数×不能被4整除的偶数 |
3 | 奇数×4的倍数×奇数/不能被4整除的偶数×不能被4整除的偶数×不能被4整除的偶数/奇数×4的倍数×不能被4整除的偶数 |
4 | 奇数×4的倍数×奇数×4的倍数/不能被4整除的偶数×不能被4整除的偶数×不能被4整除的偶数×不能被4整除的偶数/奇数×4的倍数×不能被4整除的偶数×不能被4整除的偶数 |
分析各种情况
-
奇数与4的倍数关系
奇数×4的倍数×奇数×4的倍数×奇数
奇数×4的倍数×奇数×4的倍数
4的倍数数目 >= 奇数数目-1 -
奇数与偶数关系
奇数×4的倍数×奇数×4的倍数×不能被4整除的偶数×不能被4整除的偶数×不能被4整除的偶数
4的倍数数目 >= 奇数数目 -
关键在于分析:什么情况下数列满足要求?
奇数和能被4整除的数交叉排列才能满足要求,但是要重点分析以下两种情况:结论
- 没有不能被4整除的偶数,4的倍数数目 >= 奇数数目-1
- 有不能被4整除的偶数,4的倍数数目 >= 奇数数目
参考答案
方法一:
#include <bits/stdc++.h>
using namespace std;
int main(){
int t = 0; // 数列的个数
scanf("%d",&t);
for(int j=0;j<t;++j){
int n = 0;
scanf("%d",&n);
int nums[n];// 定义存放n个数据的数组
for(int i=0;i<n;++i){
scanf("%d",&nums[i]);
}
int count4 = 0; // 四的倍数个数
int count2 = 0; // 被2整除不被4整除的个数
int odd = 0; // 奇数
for(int i=0;i<n;++i){
if(nums[i]%2==1){
++odd;
}else if(nums[i]%4==0){
++count4;
}else{
++count2;
}
}
if(count2 == 0){
if(count4>=odd-1){
printf("Yes\n");
}else{
printf("No\n");
}
}else{
if(count4>=odd){
printf("Yes\n");
}else{
printf("No\n");
}
}
}
return 0;
}
方法二:
#include <bits/stdc++.h>
using namespace std;
int main() {
int t; // 数列个数
scanf("%d", &t);
for(int k=0;k<t;++k) {
int n;
scanf("%d", &n); // 数列长度
int cnt4 = 0; // 四倍数计数
int cnt2 = 0; // 偶数计数
int cnt1 = 0; // 奇数计数
for (int i = 0; i < n; i++) { // 获取数列数据
int x;
scanf("%d", &x);
// 更新统计
if (x % 4 == 0)
cnt4++;
else if (x % 2 == 0)
cnt2++;
else
cnt1++;
}
// 统计判断
if (cnt2 == 0) { // 情况1
if (cnt4 >= cnt1 - 1)
printf("Yes\n");
else
printf("No\n");
} else { // 情况2
if (cnt4 >= cnt1)
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}
本题知识点:
数组
- 定长数组:数组长度已知,并且数组大小不能改变
- 变长数组:数组长度未知,并且数组大小可以改变
一维数组
No. | 操作 | 定长数组 | 变长数组 |
---|---|---|---|
1 | 定义数组 | int nums[n]; |
vector<int> nums; |
2 | 访问下标i 元素 |
nums[i] |
nums[i] |
3 | 存放数据 | nums[i] |
nums.push_back(数据) |
4 | 数据数量 | n |
nums.size() |
- 遍历向量
for(int i=0;i<nums.size();++i){ printf("%d\n",nums[i]); }
二维数组
No. | 操作 | 定长数组 | 变长数组 |
---|---|---|---|
1 | 定义数组 | int table[n][m]; |
vector<vector<int> > table; |
2 | 行数 | n |
table.size() |
3 | 列数 | m |
table[i].size() |
4 | 获取第i 行第j 列数据 |
table[i][j] |
table[i][j] |
这篇主要讲解了一些基础,外加2道简单题。后续的题目也会越来越难,有兴趣的小伙伴可以看紧接的下一篇博客。