1. (46)设计停车系统
题目链接:设计停车系统
请你给一个停车场设计一个停车系统。停车场总共有三种不同大小的车位:大,中和小,每种尺寸分别有固定数目的车位。
请你实现 ParkingSystem 类:
ParkingSystem(int big, int medium, int small) 初始化 ParkingSystem 类,三个参数分别对应每种停车位的数目。
bool addCar(int carType) 检查是否有 carType 对应的停车位。 carType 有三种类型:大,中,小,分别用数字 1, 2 和 3 表示。一辆车只能停在 carType 对应尺寸的停车位中。如果没有空车位,请返回 false ,否则将该车停入车位并返回 true 。
- 示例 1:
输入:
[“ParkingSystem”, “addCar”, “addCar”, “addCar”, “addCar”]
[[1, 1, 0], [1], [2], [3], [1]]
输出:
[null, true, true, false, false]
解释:
ParkingSystem parkingSystem = new ParkingSystem(1, 1, 0);
parkingSystem.addCar(1); // 返回 true ,因为有 1 个空的大车位
parkingSystem.addCar(2); // 返回 true ,因为有 1 个空的中车位
parkingSystem.addCar(3); // 返回 false ,因为没有空的小车位
parkingSystem.addCar(1); // 返回 false ,因为没有空的大车位,唯一一个大车位已经被占据了
提示:
0 <= big, medium, small <= 1000
carType 取值为 1, 2 或 3
最多会调用 addCar 函数 1000 次
2. 解题思路
- 定义结构体内容:设置三个变量来存放三种不同大小的车位
- 初始化停车场系统:定义结构体指针并分配内存,将结构体的三个变量初始化为大、中、小,三种类型的停车位数量
- 添加车辆:若对应停车位还有空位,则成功添加车辆,对应的停车位减一,返回添加成功。否则返回添加失败
- 释放系统内存
3. 代码
typedef struct {
int parking[3];
//用来存放三种不同大小的车位
} ParkingSystem;
ParkingSystem* parkingSystemCreate(int big, int medium, int small) {
//分配内存
ParkingSystem* obj=malloc(sizeof(ParkingSystem));
//赋值
obj->parking[0]=big;
obj->parking[1]=medium;
obj->parking[2]=small;
return obj;
}
bool parkingSystemAddCar(ParkingSystem* obj, int carType) {
//如果对应的停车位为0,返回假
if(obj->parking[carType-1] == 0)
{
return false;
}
else//不为0,停车位减一
{
obj->parking[carType-1]--;
return true;
}
}
void parkingSystemFree(ParkingSystem* obj) {
free(obj);//释放内存
}
/**
* Your ParkingSystem struct will be instantiated and called as such:
* ParkingSystem* obj = parkingSystemCreate(big, medium, small);
* bool param_1 = parkingSystemAddCar(obj, carType);
* parkingSystemFree(obj);
*/
(47)翻转图像
题目链接:翻转图像
给定一个 n x n 的二进制矩阵 image ,先 水平 翻转图像,然后 反转 图像并返回 结果 。
水平翻转图片就是将图片的每一行都进行翻转,即逆序。
例如,水平翻转 [1,1,0] 的结果是 [0,1,1]。
反转图片的意思是图片中的 0 全部被 1 替换, 1 全部被 0 替换。
例如,反转 [0,1,1] 的结果是 [1,0,0]。
-
示例 1:
输入:image = [[1,1,0],[1,0,1],[0,0,0]]
输出:[[1,0,0],[0,1,0],[1,1,1]]
解释:首先翻转每一行: [[0,1,1],[1,0,1],[0,0,0]];
然后反转图片: [[1,0,0],[0,1,0],[1,1,1]] -
示例 2:
输入:image = [[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]
输出:[[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
解释:首先翻转每一行: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]];
然后反转图片: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
提示:
n == image.length
n == image[i].length
1 <= n <= 20
images[i][j] == 0 或 1.
解题思路
分步操作先水平翻转再反转
水平翻转:用双指针法,交换元素
反转:让1-当前元素即可反转
代码
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** flipAndInvertImage(int** image, int imageSize, int* imageColSize, int* returnSize, int** returnColumnSizes) {
*returnSize = imageSize;
*returnColumnSizes = imageColSize;
int i = 0;
int j = 0;
//水平翻转
for(i=0;i<imageSize;i++)
{
int l = 0;
int r = imageSize - 1;
while(l<r)
{
int tmp = image[i][l];
image[i][l] = image[i][r];
image[i][r] = tmp;
l++;
r--;
}
}
//反转
for(i=0;i<imageSize;i++)
{
for(j=0;j<imageSize;j++)
{
image[i][j] = 1 -image[i][j];
}
}
return image;
}