选择题
1.
解析:十进制转换为八进制就是不断的除8,取余数。十进制转换成其他进制的数就是除以进制,取余。
解析:注意
printf
的转换,%%
只会打印一个%
,所以选A。
解析:由于
()
的原因p先和*
结合,说明p是一个指针,char (*p)[16]
是一个数组指针,指向一个char类型的字符数组,该数组中有16个元素。
解析:a表示首元素的地址,对与二维数组,首元素是第0行数组的地址。明显D选项还是一个地址。
解析:
define
是直接替换其所在位置就行,替换之后正常计算就可以,注意优先级就可以。
解析:
解析:free之后不会自动的把指针变量制成NULL,需要手动处理。
解析:题目中为二维数组,数组名表示数组首元素的地址,
a
是二维数组数组名,表示数组首元素的地址,在二维数组中,数组首元素的地址即第一行的地址,第一行的数组名可以用a[0]表示;*(a+1)
可以表示成*(&a[0]+1)
,&a[0]是int(*)[5]类型,+1之后到二维数组的第二行,所以*(a+1)
就是a[1]
,a[1]就是第二行数组名,也表示第二行首元素的地址&a[1][0]
;+2是向后移动2个int*
类型的大小。所以选B。
解析:64位编译器下指针大小为8个字节大小,所以a4占8个字节大小;a1(0 ~ 7),a2(8~ 9),浪费(10 ~ 11),a3(12~ 15),a4(16~23),共24个字节的大小,也是最大对齐数8的整型倍。选A。
解析:本题考查递归,递归类题目可以通过画图来解决。
编程题
1.不要二
解析:这里理解输入顺序为行、列。
( (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 (y1-y2) = 2 或者 y1=y2 x1-x2 = 2 假设数组全是1,经过上面的公式变换之后 1 1 1 1 1 1 --> 1 1 1 1 0 0 也就是v[i][j]和v[i+2][j]、v[i][j]和v[i][j+2] 只能有一个有蛋糕
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int row,col;//row行,col列
cin >> row >> col;
vector<vector<int>> a; //设定一个二维数组
a.resize(row);//定义行数
for(int i = 0; i < row; i++) //一行一行的进行初始化
{
a[i].resize(col,1);//全部初始化为1
}
int count = 0;
for(int i = 0; i < row; i++)
{
for(int j = 0; j < col; j++)
{
if(a[i][j] == 1) //判单是否为1
count++;
if(i + 2 < row) //判断是否在二维数组之内
a[i+2][j] = 0;
if(j + 2 < col) //判断是否在二维数组之内
a[i][j+2] = 0;
}
}
cout << count;
return 0;
}
// 64 位输出请用 printf("%lld")
答案解析:
本题看起来很难,实际是一个中等难度的题。本题如果没记错,是一个往年网易的笔试题,大家可以看到大厂的题的难度。
本题的重点是要读懂题意,并且需要多读两遍,才能读懂,本题本质就是在二维数组中每个坐标去放蛋糕,一个坐标位置放了蛋糕,跟他欧几里得距离为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>定义一个二维数组,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;//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;
}
2.把字符串转换成整数
解析:先检查字符串中是否有除数字字符及
'-'\'+'
外的其他字符,如果有直接返回;如果没有,要先检查首个字符是否为'+'、'-'
,考虑如果为'-'
,需要设立一个flag
进行标记,当第一个字符为'+'、'-'
时,先忽视,对下一个位置开始的数字串进行处理,-'0'
得到对应的数字,每次*10
加上新的数字……在最后检查标记位,如果为true
,说明第一个字符为'-'
,需要进行num = 0 - num
处理,得到结果。
class Solution {
public:
bool IsWord(string str) { //检查字符串中是否有字母
int i = 0;
for (i = 1; i < str.size(); i++) {
if ((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')) {
return false;
}
}
return true;
}
int StrToInt(string str) {
int i = 0;
/*if (!IsWord(str)) {
cout << "0";
return 0;
}*/
for (i = 1; i < str.size();i++) {//从1开始检查字符串中受否有其他字符
if ((str[i] < '0' ) || (str[i] > '9')) {
cout << "0";
return 0;
}
}
i = 0;
bool flag = false;//标记其首字符为+或者-
if (str[0] == '-') {
flag = true;//如果首字符为-则改变flag,同时i++
i++;
}
if (str[0] == '+') {
i++;//如果首字符为+不改变flag,但是i++
}
long long num = 0;
//起始条件不能确定,因为不确定str[0]是否是+或者-还是直接数字开头
for (i; i < str.size(); i++) {
int nums = str[i] - '0';
num = num * 10 + nums;
}
if (flag) {
num = 0 - num;
}
cout << num;
return num;
}
};
答案解析:解题思路非常简单,就是上次计算的结果*10,相当于10进制进位,然后加当前位的值。
例如:“123”转换的结果是
sum=0 sum*10+1->1 sum*10+2->12 sum*10+3->123
本题的关键是要处理几个关键边界条件:
- 空字符串
- 正负号处理
- 数字串中存在非法字符
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 = sum *10 + str[i] - '0';
}
return symbol * sum;
}
};