2018網際網路大廠秋招程式設計通關(一)
在這部分,我會帶著你徜徉在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道簡單題。後續的題目也會越來越難,有興趣的小夥伴可以看緊接的下一篇部落格。