【C语言刷LeetCode】492. 构造矩形(E)

本文介绍了一种用于设计矩形页面的算法,旨在找到最接近正方形且满足特定面积要求的页面尺寸。算法通过逆向枚举过程,确保长度与宽度的差距最小,适用于web开发中页面布局的设计。

作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的。 现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面。要求:

1. 你设计的矩形页面必须等于给定的目标面积。

2. 宽度 W 不应大于长度 L,换言之,要求 L >= W 。

3. 长度 L 和宽度 W 之间的差距应当尽可能小。
你需要按顺序输出你设计的页面的长度 L 和宽度 W。

示例:

输入: 4
输出: [2, 2]
解释: 目标面积是 4, 所有可能的构造方案有 [1,4], [2,2], [4,1]。
但是根据要求2,[1,4] 不符合要求; 根据要求3,[2,2] 比 [4,1] 更能符合要求. 所以输出长度 L 为 2, 宽度 W 为 2。
说明:

给定的面积不大于 10,000,000 且为正整数。
你设计的页面的长度和宽度必须都是正整数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-the-rectangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

长度 L 和宽度 W 之间的差距应当尽可能小,那么这样反着枚举就行了:for (i = (area + 1)/2; i > 1; i--)

int* constructRectangle(int area, int* returnSize){
    int i, j;
    int res = 0;
    int *out;
    int lastLenght = 0;
    int weith;
    
    out = (int *)malloc(sizeof(int) * 2);
    *returnSize = 2;
    
    for (i = (area + 1)/2; i > 1; i--) {
        res = area % i;
        
        if (res == 0) {
            weith = area/i;
            if(weith > i) {
                break;
            }
            
            lastLenght = i;
        }
    }
    
    if (lastLenght != 0) {
        out[0] = lastLenght;
        out[1] = area/lastLenght;
    } else {
        out[0] = area;
        out[1] = 1;
    }

    return out;
}

 

<think>我们正在回答用户的问题:如何系统学习C++并理解其与C语言的区别。根据用户提供的引用材料,我们可以总结出C和C++的主要区别在于编程范式的不同(面向过程 vs 面向对象)以及C++在C的基础上增加的新特性。同时,用户要求按照指定的格式进行回答,包括使用LaTeX数学表达式、引用标识等。 我们将从以下几个方面进行回答: 1. C++与C语言的核心区别(编程范式、设计思想) 2. C++在语法上对C的扩展(具体特性) 3. 系统学习C++的建议步骤 4. 相关问题生成 注意:在回答中,我们将引用用户提供的引用材料,并在适当位置添加引用标识[^1][^2][^3][^4]。</think>### 系统学习C++语言及其与C语言的区别 C++在C语言基础上进行了全面扩展,核心区别在于**编程范式**和**设计思想**的转变。以下是系统学习路径和关键区别分析: --- #### 一、核心区别:编程范式与设计思想 1. **面向过程 vs 面向对象** - **C语言**:聚焦算法和数据结构,通过函数实现过程化控制[^1][^2]。 ```c // C示例:过程化计算矩形面积 #include <stdio.h> struct Rectangle { double width, height; }; // 数据结构定义 double calc_area(struct Rectangle r) { // 独立函数操作数据 return r.width * r.height; } ``` - **C++**:通过对象模型映射问题域,强调封装、继承和多态[^1][^4]: ```cpp // C++示例:面向对象实现 class Rectangle { private: // 封装数据 double width, height; public: double calc_area() const { // 成员函数操作数据 return width * height; } }; ``` 2. **内存管理机制** | 特性 | C语言 | C++ | |--------------|------------------------|------------------------------| | 动态分配 | `malloc/free` | `new/delete` + 智能指针 | | 安全性 | 手动管理,易泄漏 | RAII机制自动释放[^4] | | 初始化 | 分配后需单独初始化 | `new`同时调用构造函数 | ```cpp // C++智能指针示例 auto ptr = std::make_unique<Resource>(); // 自动管理生命周期[^4] ``` 3. **类型系统增强** - **引用类型**:C++引入引用(`int& ref = x`),避免指针的复杂操作[^4] - **强类型检查**:C++禁止隐式类型转换(如`void*`需显式转换) - **函数重载**:C++支持同名函数不同参数(C不支持)[^4] ```cpp void print(int i); // 合法 void print(double d); // 函数重载 ``` --- #### 二、C++核心扩展特性 1. **类与对象** - 封装:`private/protected/public`访问控制 - 继承:`class Derived : public Base` - 多态:虚函数(`virtual`) + 动态绑定 2. **模板与泛型编程** ```cpp template <typename T> // 类型参数化 T max(T a, T b) { return (a > b) ? a : b; } ``` 3. **现代C++特性** - 智能指针:`unique_ptr`, `shared_ptr` - Lambda表达式:`[](int x) { return x*x; }` - 移动语义:`std::move`减少拷贝开销 4. **STL标准库** ```cpp std::vector<int> vec = {3,1,4}; // 动态数组 std::sort(vec.begin(), vec.end()); // 泛型算法 ``` --- #### 三、系统学习路径建议 1. **基础阶段(2-3周)** - 掌握C++语法:类型系统、引用、作用域运算符(`::`) - 理解面向对象三大特性(封装/继承/多态) - 练习C与C++对比编码(如字符串处理、内存管理) 2. **进阶阶段(4-6周)** - 模板与STL容器/算法 - 异常处理、RAII原则 - C++11/14/17新特性实战 3. **项目实践** - 实现小型学生管理系统(使用类+智能指针) - 用STL重写C语言数据结构(如链表/队列) > **关键建议**:避免过早使用IDE自动化工具,先在命令行环境手动编写完整程序[^1]。 --- #### 四、典型区别案例分析 1. **结构体升级** - C结构体:纯数据集合 - C++结构体:可包含成员函数、继承、访问控制(默认`public`)[^4] 2. **const关键字** ```c const int SIZE = 10; int arr[SIZE]; // C语言:错误!const变量不是编译期常量 ``` ```cpp constexpr int SIZE = 10; // C++: constexpr编译期常量 int arr[SIZE]; // 合法 ``` 3. **函数设计** - C语言:函数独立于数据 - C++:成员函数与数据绑定,支持`const`成员函数保证状态不变 --- ### 学习资源推荐 1. 书籍:《C++ Primer》《Effective C++》 2. 实践:LeetCode C++题库(对比C实现) 3. 文档:[cppreference.com](https://en.cppreference.com)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值