算法分析与设计week05--7.Reverse Integer

本文介绍了一种有效的整数反转算法,特别关注了32位有符号整数的处理,并提供了详细的C++实现代码及溢出判断逻辑。通过迭代方式完成数字的反转,同时确保在反转过程中不会发生溢出。

7.Reverse Integer

Description

Reverse digits of an integer.
Note:
The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.

Example

Example1: x = 123, return 321
Example2: x = -123, return -321

Analyse

关键在于对溢出数据的判断:
if( (unsigned)x > INT_MAX) 溢出
实际上,x的正负对是否溢出没有影响,所以可以直接比较数值的大小。

class Solution {
public:
    int reverse(int x) {
        int x_ = 0;

        while (x != 0) 
        {
            if (abs(x_) > INT_MAX / 10)
                return 0;

            x_ = x_ * 10 + x % 10;
            x = x / 10;
        }

        return x_;
    }
};

复杂度分析

时间复杂度:O(n)
空间复杂度:O(1)

参考链接:http://www.cnblogs.com/grandyang/p/4125588.html

### 关于头歌平台《算法设计分析》课程中的贪心算法 贪心算法是一种通过一系列局部最优的选择来构建全局最优解的方法。它从问题的一个初始状态出发,按照某种既定的策略逐步推进,直到无法再继续为止[^1]。这种方法的核心在于其每一步决策都是基于当前状态下能够获得的最大收益或最小代价。 #### 头歌平台上的课程特点 在头歌平台上,《算法设计分析》课程通常会详细介绍贪心算法的设计思路及其适用场景。具体来说: - **定义基本思想** 贪心算法的基本思想是以逐步的局部最优选择为目标,从而达到最终的全局最优解[^1]。这种算法适用于具有最优子结构性质的问题,即整体问题的最优解可以通过子问题的最优解组合而成[^2]。 - **典型应用案例** - **背包问题(物品可分割)** 对于允许物品分割的情况,贪心算法可以根据单位重量的价值对物品进行排序,并优先选取价值密度最高的物品填充背包[^3]。 - **最小生成树问题** 使用Kruskal算法或Prim算法时,均采用了贪心的思想,每次选择权重最小的边加入生成树集合,直至形成一棵完整的树[^2]。 - **哈夫曼编码** 构建前缀码的过程中也体现了贪心原则,通过对频率较低字符赋予较短路径的方式减少总编码长度[^2]。 - **局限性讨论** 尽管贪心算法效率高且结果接近最优,但它并不总是能提供完全正确的解决方案。例如,在0-1背包问题中,由于物品不可分割,单纯依赖贪心策略可能会导致次优甚至错误的结果[^3]。 #### 学习建议 为了更好地掌握头歌平台上的相关内容,可以从以下几个方面入手: 1. 理解并记忆贪心算法的关键特性——最优子结构性质和无后效性; 2. 结合实际例子练习如何制定合理的贪心准则; 3. 探讨哪些经典问题是适合采用此方法求解的,又有哪些例外情况需要注意规避。 以下是实现部分典型案例的Python代码示例: ```python def knapsack_fractional(weights, values, capacity): n = len(values) ratio = [(v / w, w) for v, w in zip(values, weights)] ratio.sort(reverse=True) total_value = 0 remaining_capacity = capacity for value_per_weight, weight in ratio: if weight <= remaining_capacity: total_value += value_per_weight * weight remaining_capacity -= weight else: fraction = remaining_capacity / weight total_value += value_per_weight * fraction break return total_value weights = [10, 20, 30] values = [60, 100, 120] capacity = 50 print(knapsack_fractional(weights, values, capacity)) # 输出最大价值 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值