【笔试强训】Day 3

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【笔试强训】Day 3

🌈选择题


以下程序的输出结果是(做错了)


#include <stdio.h>
main() {
  char a[10] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 0}, *p;
  int i;
  i = 8;
  p = a + i;
  printf("%s\n", p - 3);
}


A 6

B 6789

C ‘6’

D 789


题目解析:


a是一个数组名,也是一个指向数组首元素的指针;p=a+8:a向右偏移8个char的大小,也就是8个字节,指向‘9’。

p - 3也就是向左偏移3个字节,然后%s打印:遇到\0才会停止打印;也就是打印6789

答案选B


以下程序的输出结果是(做错了)


#include <iostream.h>
int main()
{
  int x=3,y=3;
  switch(x%2)
  {
  case 1:
  switch (y)
  {
    case 0:
    cout<<"first";
    case 1:
    cout<<"second";
    break;
    default:
    cout<<"hello";
  }
  case 2:
  cout<<"third";
  }
  return 0;
}


A second third

B hello

C first second

D hellothird


题目解析:


x%2 = 1,进入case1;y=3,进入default语句;把hello打印出来

由于default后没有break语句跳出循环,所以还是要执行外层的case2,再打印出third,所以最后打印出来的是hellothird

答案选D


以下能对二维数组a进行正确初始化的语句是()


A int ta[2][]={{0,1,2},{3,4,5}};

B int ta[][3]={{0,1,2},{3,4,5}};

C int ta[2][4]={{0,1,2},{3,4},{5}};

D int ta[][3]={{0,2},{},{3,4,5}};


题目解析:


二维数组初始化是不能省略列数的,行数可以省略,这个不用我多解释了吧

A中没有初始化列;C中多初始化了一行;D中 必须连续的初始化,不能间隔

答案选B


能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是(做错了)


A return这二个数

B 形参用数组

C 形参用二个指针

D 用二个全局变量


题目解析:


return不能返回两个,多了要放进数组等容器

答案选A


int *p[4] 与选择项中的() 等价


A int p[4]

B int *p

C int *(p[4])

D int (*p)[4]


题目分析:


int *p[4] : p先和[]结合,形成一个数组,存放4个int *类型的指针——> 指针数组

A是整形数组 ;B是int类型的指针;C和题目一样是指针数组;D中p先和* 结合,指向一个大小为4的数组 ——> 数组指针

答案选C


设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是(做错了)


A n=0;while(ch=getchar()!=‘\n’)n++;

B n=0;while(getchar()!=‘\n’)n++;

C for(n=0;getchar()!=‘\n’;n++);

D n=0;for(ch=getchar();ch!=‘\n’;n++);


题目解析:


for循环的初始化部分只会执行一次,所以D中的ch=getchar()只执行一次,不能获得每个字符

答案选D


以下代码执行之后ptr指向的内容是?


char *ptr;

char myString[] = "abcdefg";

ptr = myString;

ptr += 5;


A Compiler error

B fg

C efg

D defg


题目解析:


ptr指向的是字符a,ptr是char类型,ptr+=5,所以向右偏移5个字节,指向的是f

ptr是字符指针,输出的是字符串,直到\0结尾

答案选B


下面3段程序代码的效果一样吗()


int b;

(1)const int *a = &b;

(2)int const *a = &b;

(3)int *const a = &b;


A (2)=(3)

B (1)=(3)

C (1)=(2)

D 都不一样


题目解析:


还是老知识点:指针常量和常量指针的区别:const后面跟的都不能变就是了

(1)是常量指针;(2)是常量指针;(3)是指针常量

答案选C


32位系统中,定义**a[3][4],则变量占用内存空间为(做错了)


A 4

B 48

C 192

D 12


a先和[]进行结合,是一个三行四列的数组,存放的是**的指针类型,所以大小:4*12 = 48

答案选B


假设在一个 32 位 little endian(小端) 的机器上运行下面的程序,结果是多少?(做错了)


#include <stdio.h>
int main(){
  long long a = 1, b = 2, c = 3;
  printf("%d %d %d\n", a, b, c);
  return 0;
  }


A 1,2,3

B 1,0,2

C 1,3,2

D 3,2,1


0a2653c851af460fa595bd959398a8f1.png


所以输出的是1、0、2, 答案选B


🌈编程题


1️⃣字符串中找出连续最长的数字串

题目地址:传送


0a2653c851af460fa595bd959398a8f1.png


解题思路:


定义两个字符串,cur存的是遍历遇到的数字字符串,ret存结果。

i遍历字符串,遇到数字就放进去cur中

如果cur的size比ret的大就交换给给ret,cur清零


2019082413041482.gif


⚡注意一个细节:如果遍历到最后一个i是数字的话,就会出错


i走到最后,i++后就等于**\0**,也就是等于size(),不再进入循环,所以没有把cur的数字串给给ret

所以i <= str.size(), \0不属于数字,所以直接进入交换


2019082413041482.gif


上代码:


#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str, cur, ret;
    cin>>str;
    for(int i = 0; i <= str.size(); ++i)//记得加上=
    {
        if(str[i] >= '0' && str[i] <= '9')
        {
            cur += str[i];
        }
        //不是数字就进行比较
        else
        {
            if(cur.size() > ret.size())
            {
                ret = cur;
            }
            else
            {
                cur.clear();
            }
        }
    }
    cout<<ret<<endl;
    return 0;
}


2️⃣数组中出现次数超过一半的数字

题目地址:传送


0a2653c851af460fa595bd959398a8f1.png


两种解题思路:


🎨排序思路:

sort();找到中间的数字X

再次遍历数组,看看这个数字X,出现次数是否大于数组长度的一半

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        if(numbers.empty()) return 0;
        sort(numbers.begin(), numbers.end());
        int MidNum = numbers[numbers.size() / 2];//定义中位数X
        int count = 0;//出现次数
        for(int i = 0 ; i < numbers.size(); i++)
        {
            if(numbers[i] == MidNum)
            {
                count++;
            }
        }
        if(count > numbers.size() / 2)
        {
            return MidNum;
        }
        else
        {
            return 0;
        }
    }
};


🔥两数相消思路(让面试官眼前一亮)

如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数!(前提是存在众数)


设立result 和times 分别存放数 与 出现的次数

如果后一个数和前数相等,time++,否则 time--,time为0时,result重新定义arr[i]

所以最后还要验证众数是否存在

0a2653c851af460fa595bd959398a8f1.png

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        if(numbers.empty()) return 0;
        int result =  numbers[0]; 
        int times = 1;
        for(int i = 1; i < numbers.size(); ++i)
        {
            if(times != 0)
            {
                if(numbers[i] != result)
                {
                    times--;
                }
                else
                {
                    times++;
                }
            }
            else
            {
                result = numbers[i];
                times = 1;
            }
        }
        //遍历数组,判断result中的值是否为众数
        int count = 0;
        for(int i = 0; i < numbers.size(); ++i)
        {
            if(result == numbers[i])
            {
                count++;
            }
        }
        if(count > numbers.size() / 2)
        {
            return result;
        }
        return 0;
    }
};
相关文章
|
算法 C++
48天C++笔试强训 001(下)
48天C++笔试强训 001(下)
49 1
|
8月前
【笔试强训】day12
【笔试强训】day12
|
8月前
|
人工智能
【笔试强训】day10
【笔试强训】day10
|
8月前
【笔试强训】day9
【笔试强训】day9
|
8月前
【笔试强训】day8
【笔试强训】day8
|
缓存 NoSQL 算法
搞定笔试 | 搞定笔试题 - 第 004 期
搞定笔试 | 搞定笔试题 - 第 004 期
155 0
|
存储 C语言 C++
48天C++笔试强训 001(上)
48天C++笔试强训 001
68 0
|
SQL 算法 Java
第一次笔试【面试】
第一次笔试【面试】
130 0
|
5G Linux Python
搞定笔试 | 搞定笔试题 - 第 001 期
搞定笔试 | 搞定笔试题 - 第 001 期
|
算法 C++
【笔试强训】Day_01
目录 一、选择题 1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 二、编程题 1、组队竞赛 2、删除公共字符
104 0
【笔试强训】Day_01