笔试强训day6

一. 单选

1. 十进制变量i的值为100,那么八进制的变量i的值为()

A 146
B 148
C 144
D 142
正确答案:C


2.执行下面语句后的输出为
int I=1;
if(I<=0)
printf("****\n") ;
else
printf("%%%%\n");

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


3.对于下面的C语言声明描述正确的一项是()
char (*p)[16]

A p是长度为16的字符指针数组
B p是包含16个字符的字符串
C p是指向长度为16的字符数组的指针
D p是长度为16的字符数组
正确答案:C 

 

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

A a[i][j]
B *(a[i]+j)
C *(*(a+i)+j)
D *(a+i*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
正确答案:D

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

x /= 3+2*3+2 / 3+2*3+2 = 6/17 = 0


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
正确答案:C


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

 A 32位系统下任何类型指针的长度都是4个字节
B 指针的数据类型声明的是指针实际指向内容的数据类型
C 野指针是指向未分配或者已释放的内存地址
D 当使用free释放掉一个指针内容后,指针变量的值被置为NULL
正确答案:D

A:32位下指针是4字节,64位下指针是8字节

D:free只会将指向的空间释放掉,不会置空


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列元素的值
正确答案:B 

int a[4][5];二维数组

a[4] 等价于 *(a+4)

数组名a表示第0行的地址

a+1表示第1行的地址

*(a+1)+2表示第1行第2列元素的地址

*(*(a+1)+2)表示第1行第2列元素的值


9.有一个如下的结构体:
struct A{
        long a1;
        short a2;
        int a3;
        int *a4;
};
请问在64位编译器下用sizeof(struct A)计算出的大小是多少()

A 24
B 28
C 16
D 18
正确答案:A 

 

a1: min(4, 8)   0~3

a2: min(2, 8)   4~5

a3: min(4, 8)   8~11

a4: min(8, 8)   16~23

总共:24字节

对齐:min(8, 8)   24

 

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
正确答案:D 

 

 

二、编程

题目ID:45840-不要二
链接:https://www.nowcoder.com/practice/1183548cd48446b38da501e58d5944ebtpId=85&&tqId=29840&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking 

【题目解析】:
本题看起来很难,实际是一个中等难度的题。本题如果没记错,是一个往年网易的笔试题,大家可以看到大厂的题的难度。
本题的重点是要读懂题意,并且需要多读两遍,才能读懂,本题本质就是在二维数组中每个坐标去放蛋糕,一个坐标位置放了蛋糕,跟他欧几里得距离为2的位置不能放蛋糕,这个就是关键点。对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为: ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根 。
也就是说:如果(x1,y1)放了蛋糕,则满足 ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) == 4的(x2,y2)不能放蛋糕。
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) == 4看起来是一个无解的表达式。
但是可以进行加法表达式分解:
1+3=4
3+1=4
2+2=4
0+4=4
4+0=4
仔细分析前三个表达式是不可能的,因为(x1-x2) * (x1-x2)表达式结果不能等于2或3。
也就是说( (x1-x2) * (x1-x2) 和(y1-y2) * (y1-y2) )两个表达式一个等于0,一个等于4.
可以看出:假设放蛋糕的位置是(x1,y1),则不能放蛋糕的位置(x2,y2),满足x1==x2,y1-y2==2或者x1-
x2==2,y1==y2.
【解题思路】:
仔细读理解了上面的题目解读,本题就非常简单了,使用vector<vector<int>>定义一个二维数组,resize开空间并初始化,每个位置初始化为1,表示当蛋糕,a[i][j]位置放蛋糕,则可以标记处a[i][j+2]和a[i+1][j]位置不能放蛋糕,遍历一遍二维数组,标记处不能放蛋糕的位置,统计也就统计出了当蛋糕的位置数。

// 直接暴力计算,默认所有蛋糕的位置标记成1,不能放的地方标记成0
// 1 1 0 0 1 1
// 1 1 0 0 1 1
// 0 0 1 1 0 0
// 0 0 1 1 0 0
#include<iostream>
#include<vector>
using namespace std;
int main() {
    int w, h, res = 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) {
                res++;
                // 标记不能放蛋糕的位置
                if ((i + 2) < w)
                    a[i + 2][j] = 0;
                if ((j + 2) < h)
                    a[i][j + 2] = 0;
            }
        }
    }
    cout << res;
    return 0;
}

 23292-字符串转成整数
https://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26etpId=13&&tqId=11202&rp=6&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

 【题目解析】:
本题本质是模拟实现实现C库函数atoi,不过参数给的string对象
【解题思路】:
解题思路非常简单,就是上次计算的结果*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
        } else if (str[0] == '+') { //处理正号
            symbol = 1;
            str[0] = '0';
        }
        int sum = 0;
        for (int i = 0; i < str.size(); ++i) {
            if (str[i] < '0' || str[i] > '9') {
                sum = 0;
                break;
            }
            sum = sum * 10 + str[i] - '0';
        }
        return symbol * sum;
    }
};

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值