1. 程式人生 > >2018網際網路大廠秋招程式設計通關(一)

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;
}

本題知識點:

  1. 字串變數string s;
  2. 獲取字串長度s.size()
  3. 獲取字串i位置字元s[i]
  4. 遍歷字串
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道簡單題。後續的題目也會越來越難,有興趣的小夥伴可以看緊接的下一篇部落格。