✨个人主页: 北 海
🎉所属专栏: C/C++相关题解
🎃操作环境: Visual Studio 2019 版本 16.11.17
文章目录
- 选择题
- 1. 计算机组成原理
- 编程题
- 1. 不要二
- 2. 把字符串转换成为整数
选择题
1. 计算机组成原理
题目:执行下面语句后的输出为()
int I=1;
if(I<=0)
printf("****\n");
else
printf("%%%%\n");
选项:
- A.
%%
- B.
****
- C.
有语法错,不能正确执行
- D.
%%%%
题目分析:比较考验 C
语言基础的题目,%
配合其他字符,可将其进行转义,比如 %d
表示匹配整型进行输出,如果想单纯表示 %
时,需要使用两个 %
表示一个 %
,即在打印时 %%
-> %
结果:
A
编程题
1. 不要二
题目链接:不要二
题目分析:这也是一道纯数学题,求在 W * H
的二维矩阵中,至多可以放下多少块距离不等于 2
的蛋糕,因为是二维矩阵,所以每个格子都有相应的坐标,而两块蛋糕之间的距离的平方可以通过公式 (x1 - x2) * (x1 - x2) + (y1 -y2) * (y1 - y2)
得出
此时就比较简单了,直接创建一个 W * H
的二维数组,然后判断能否填入蛋糕(上下左右都不能有蛋糕),最后再返回成功填入的蛋糕数即可
#include <iostream>
#include <vector>
using namespace std;
bool getCake(vector<vector<int>>& vv, int x, int y)
{
//判断
if ((x - 2) >= 0 && vv[x - 2][y])
return false;
else if ((x + 2) < vv.size() && vv[x + 2][y])
return false;
else if ((y - 2) >= 0 && vv[x][y - 2])
return false;
else if ((y + 2) < vv[0].size() && vv[x][y + 2])
return false;
return true;
}
int main()
{
//格中距离,不能为2
int x = 0, y = 0;
cin >> x >> y;
//状态:0表示有蛋糕,1表示没蛋糕
vector<vector<int>> vv;
vv.resize(x, vector<int>());
for (int i = 0; i < x; i++)
vv[i].resize(y, 0); //初始化状态
int cnt = 0; //计数
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
//填入蛋糕:距离为2的格子处没蛋糕或者越界,可正确填入
if (getCake(vv, i, j))
{
vv[i][j] = 1;
cnt++;
}
}
}
cout << cnt << endl;
return 0;
}
2. 把字符串转换成为整数
题目链接:把字符串转换成为整数
题目分析:这是一道来自剑指Offer的中等题,其实就是模拟库中的字符串转整数函数(atoi
),题目要求比较多:给定字符串中包含很多干扰信息,比如空格、非数字字符等,所以在进行转换时需要特别注意
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
int StrToInt(string s) {
string numStr;
bool flag = true; //符号位
int zero = 0; ///前导0数
for (auto e : s)
{
if (isdigit(e) || ((e == '-' || e == '+') && numStr.size() == 0 && flag))
{
//避免前导0
if (e == '0' && (numStr.size() == 0 || numStr.size() == 1 && !flag))
zero++;
else
{
if (e == '-' || e == '+') flag = false; //占用符号位
if ((e == '-' || e == '+') && zero) return 0;
if (e != '+') numStr += e;
}
}
else
{
if(zero && e == ' ')
return 0;
if (numStr.size() >= 0 && e != ' ')
break; //无法组成
}
}
//转换为整数
//需要进行越界处理
if (numStr.front() == '-' && numStr.size() > 11)
return INT_MIN;
else if (numStr.front() != '-' && numStr.size() > 10)
return INT_MAX;
flag = false;
reverse(numStr.begin(), numStr.end());
int val = 0;
int base = 0;
for (auto e : numStr)
{
if (e == '-')
{
val *= -1;
flag = true; //标识为负数
}
else
val += (e - '0') * (int)pow(10, base);
base++;
}
//边缘越界:负数变成了正数,正数变成了负数
if (flag && val > 0)
return INT_MIN;
else if (!flag && val < 0)
return INT_MAX;
return val;
}
};
注意: 需要特别注意边缘越界的情况,比如 INT_MAX + 1
是越界的
相关文章推荐
Day5 统计回文、连续最大和
Day4 计算糖果、进制转换
Day3 字符串中找出连续最长的数字串、数组中出现次数超过一半的数字
Day2 排序子序列、倒置字符串
Day1 组队竞赛、删除公共字符