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道简单题。后续的题目也会越来越难,有兴趣的小伙伴可以看紧接的下一篇博客。

猜你喜欢

转载自blog.csdn.net/chao199512/article/details/83713409