强训day2

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

 目录

一.选择题

二.编程题


一.选择题

1.[单选题]十进制变量i的值为100,那么八进制的变量i的值为()

A 146       B 148       C 144      D 142

解析:

这道题很简单,将十进制转换为八进制,将100商8,将所有余数按顺序排列就是了。

答案就是C

2.[单选题]执行下面语句后的输出为()

int I=1;

if(I<=0)

       printf("****\n") ;

else

       printf("%%%%\n");

A %%      B ****      C 有语法错,不能正确执行     D %%%%

解析:

这里主要考察的是格式化串。

对于printf,它是格式是printf(格式化串,参数1,参数2,......)

格式化串:printf第一个参数只会的参数要按照指定的格式打印

比如:%d——>按照整型方式打印

          %f——>按照float方式打印

......格式化串有一定的规定:%之后跟上C语言特点的字符才能表示一定的格式化,如果不是特点的,比如%Q,那么在打印的时候,%视为无效,直接打印Q。

回到题目中,我们需要执行的语句是printf("%%%%\n"),这也是个特殊情况,两个%打印一个%,所以答案是A。

3.[单选题]对于下面的C语言声明描述正确的一项是()

char (*p)[16]

A     p是长度为16的字符指针数组

B     p是包含16个字符的字符串

C    p是指向长度为16的字符数组的指针

D    p是长度为16的字符数组

解析:

因为p与*号结合了,所以p是一个指针,不是数组,代表着该指针指向的是长度为16的数组。

没有结合,p才是数组,比如说是:char *p[16],代表p是一个指针数组。

所以,答案选C

4.[单选题]数组a的定义语句为“float a[3][4];”,下列()是对数组元素不正确的引用方法

A a[i][j]      B *(a[i]+j)      C *(*(a+i)+j)      D *(a+i*4+j)

解析:

这道题考察的是对二维数组的理解。

对于一个二维数组a[i][j],我们可以看作是i个一位数组,长度是j。

在访问一维数组的时候,是a[i]这样写的,而且a[i]==*(a+i);

所以,对于访问二维数组:

①a[i][j]     ②*(a[i]+j):意思是先在a[i]行找第j列,然后解引用

③*(*(a+i)+j):这个跟②是一样的。④这个不行,因为a+i*4,如果i==1,就是a+4+j,然后解引用,算的是行数,而且可能会越界。

答案是D

5.[单选题]下面程序的输出结果是__________。

#include < iostream.h>

#define SQR(A) A*A

void main()

{

       int x=6,y=3,z=2;

       x/=SQR(y+z)/SQR(y+z);

       cout< < x< < endl;

}

A 5    B 6    C 1    D 0

解析:

这道题考察的是宏。

运算的过程如下:

ZJ6)0P$T_RZ07WZPO8BPJS6.png

所以答案是D

6.[单选题]当n=5时,下列函数的返回值是()

int foo(int n)

{

       if(n<2)

       {

               return n;

       }

       else

               return 2*foo(n-1)+foo(n-2);

}

A 5      B 11      C 29      D 10

解析:

这道题是对递归的理解。使用递归去做运算即可;

YL(4K3FT185E9]{D1IS[1AL.png

7.[单选题]以下对C语言的”指针“描述不正确的是()

A   32位系统下任何类型指针的长度都是4个字节

B   指针的数据类型声明的是指针实际指向内容的数据类型

C   野指针是指向未分配或者已释放的内存地址

D   当使用free释放掉一个指针内容后,指针变量的值被置为NULL

解析:

在64系统下,指针是8个字节,32系统是4个字节

指针的数据类型,比如int* a,a的内容就是int类型的

C选项考察的是野指针的定义

D的话,当free掉后,指针变量的内容没有被置为NULL,而是指针失去了这个地址,需要主动去置空。如果不置空,就会变成野指针。

防止野指针:①free后置空   ②不要越界访问   ③创建指针的时候进行初始化

所以选D;

8.[单选题]数组定义为”int a[4][5];”, 引用”*(a+1)+2″表示()(从第0行开始)

A   a[1][0]+2

B   a数组第1行第2列元素的地址

C   a[0][1]+2

D   a数组第1行第2列元素的值

解析:

这个跟第四题类型。

对于*(a+1)+2,首先(a+1)拿到的是这个二维数组第1行的地址,然后*(a+1)是对其进行解引用,拿到的是第1行的内容,然后是*(a+1)+2,它表示的是a数组第一行第二列那个元素的地址,因为没有解引用。

所以选B;

9.[单选题]有一个如下的结构体:

struct A{

       long a1;

       short a2;

       int a3;

       int *a4;

};

请问在64位编译器下用sizeof(struct A)计算出的大小是多少()

A 24    B 28    C 16    D 18

解析:

这里考察的是结构体内存对齐规则:

J_{_NFED1{DF17GP4EFV[5V.png

10.[单选题]运行结果是()

#include <iostream>

using namespace std;

int f(int n)

{

       if (n==1)

               return 1;

       else

               return (f(n-1)+n*n*n);

}

int main()

{

       int s=f(3);

       cout<<s<<endl;

       return 0;

}

A 8    B 9    C 27    D 36

解析:

这里考察的也是递归的理解和运行,f(3)= f(2)+3*3*3;f(2)=f(1)+2*2*2;f(1)=1;f(3)=1+2*2*2+3*3*3=36,因此答案选D

二.编程题

1.题目:不要二

题目描述:二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能 等于2。 对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为: ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根 小易想知道最多可以放多少块蛋糕在网格盒子里。

输入描述:每组数组包含网格长宽W,H,用空格分割.(1 ≤ W、H ≤ 1000)

输出描述:输出一个最多可以放的蛋糕数

示例1:输入:3 2   输出:4

分析:

对于知道题,我们可以从两个格子坐标的欧几里得距离入手:因为两个各种的欧几里得距离不能等于2,相对于是两个坐标直接的距离的平方不能为4,所以可以写出:

(x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) = 4 ,接着我们分析出,

在整数中4是由0+4 = 4,4+0=4,2+2=4,1+3=4,3+1=4这五种加法得出。

在这五种当中,只有0+4和4+0成立,其它三种不成立。为啥?

对于3+1:没有一个数(整型int)的平方(x1-x2) * (x1-x2)可以等于3,只能1*1,2*2 ...所以这个加法不行,同理2+2,1+3也如此。

得出这个结论后,我们对0+4和4+0进行分析:

对于0+4:即x1-x2 = 0,y1-y2=2,所以是x1=x2,y1=2+y2

对于4+0:即x1-x2=2,y1-y2=0,所以是x1=2+x2,y1=y2

也就是说,当我们在a[i][j]这个位置放置了蛋糕后,a[i][j+2]和a[i+2][j]这两个位置不能放了!

得出最终结论后,我们先创建一个二维数组,然后将其初始化为1.然后开始遍历,如果是1,然后将它对应的两个位置置为0,一直遍历到结束,每次进行计数便可。

代码如下:

int main()
{
  int w, h, cnt = 0;
  cin >> w >> h;
  vector<vector<int>> a;
  a.resize(w);//行数
  for (auto& e : a)
  {
    e.resize(h, 1);//列数
  }
  for (int i = 0; i < w; i++)
  {
    for (int j = 0; j < h; j++)
    {
      if (a[i][j] == 1)
      {
        cnt++;
        if ((i + 2) < w)
        {
          a[i + 2][j] = 0;
        }
        if ((j + 2) < h)
        {
          a[i][j + 2] = 0;
        }
      }
    }
  }
  cout << cnt << endl;
  return 0;
}

image.gif

2.题目:把字符串转换成整数

题目描述:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0。数据范围:字符串长度满足   0<=n<=100

注意: ①字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0 ②字符串中可能出现 +/- 且仅可能出现在字符串首位。

输入描述:输入一个字符串,包括数字字母符号,可以为空

输出描述:如果是合法的数值表达则返回该数字,否则返回0

示例1:

输入:

+2147483647

1a33

输出:

2147483647

0

分析:

解题思路非常简单,就是上次计算的结果*10,相当于10进制进位,然后加当前位的值。

例如:

“123”转换的结果是

sum=0

sum*10+1->1

sum*10+2->12

sum*10+3->123

本题的关键是要处理几个关键边界条件:

1. 空字符串

2. 正负号处理

3. 数字串中存在非法字符

代码如下:

class Solution {
public:
  int StrToInt(string str)
  {
    if (str.empty())
      return 0;
    int symbol = 1;
    if (str[0] == '-') //处理负号
    {
      symbol = -1;
      str[0] = '0'; //这里是字符'0',不是0
    } e
      lse if (str[0] == '+') //处理正号
    {
      symbol = 1;
      str[0] = '0';
    } i
      nt sum = 0;
    for (int i = 0; i < str.size(); ++i)
    {
      if (str[i] < '0' || str[i] > '9')
      {
        sum = 0;
        break;
      } s
        um = sum * 10 + str[i] - '0';
    } r
      eturn symbol* sum;
  }
};

image.gif


相关文章
|
算法 C++
48天C++笔试强训 001(下)
48天C++笔试强训 001(下)
45 1
|
6月前
【笔试强训】day12
【笔试强训】day12
|
6月前
【笔试强训】day9
【笔试强训】day9
|
6月前
【笔试强训】day8
【笔试强训】day8
|
6月前
|
人工智能
【笔试强训】day10
【笔试强训】day10
|
存储 C语言 C++
48天C++笔试强训 001(上)
48天C++笔试强训 001
59 0
强训Day1
为了校招而进行的强训DAY1
强训Day1
|
人工智能 安全 测试技术
【笔试强训】Day_02
目录 一、选择题 1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 二、编程题 1、排序子序列 2、倒置字符串
125 0
【笔试强训】Day_02
|
算法 C++
【笔试强训】Day_01
目录 一、选择题 1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 二、编程题 1、组队竞赛 2、删除公共字符
92 0
【笔试强训】Day_01
|
算法 编译器 C语言
笔试强训错题总结(一)(下)
笔试强训错题总结(一)