[面试] 算法(一) —— Str2Int

本文介绍了一种改进的字符串转整数函数实现方法,包括处理空指针、空字符串、溢出、非法输入等问题,并通过全局状态变量增强健壮性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“123” ⇒ 123

不允许使用 atoi 等其他类似的库函数;

一种 naive 版:

int str2int(const char* str)
{
    if (str == NULL)
        return 0;
    int num = 0;
    while (*str != '\0')    // while (*str != 0), '\0' == 0 
        num = num * 10 + *str++ - '0';
    return num;
}

其实代码的核心逻辑在(num = num*10 + *str - ‘0’;):

{[ (0*10 + k1) ] * 10 + k2 }*10 + k3 = 100*k1 + 10*k2 + k3{[ (0*10 + k1) ] * 10 + k2 }*10 + k3 = 100*k1 + 10*k2 + k3

这段代码的核心问题在未考虑空指针 NULL,空字符串”“、正负号、溢出、非法输入(0-9以外的其他输入)等方方面面的测试用例;

这里的一个问题在于,我们将空指针 NULL、空字符串”“,溢出、非法输入,统统返回为 0,可是如果遇到真正的”0”,怎么办?

设置一个全局的状态变量(g_status),初始化为 Invalid,直到能够遍历到字符串的结尾('\0')为 Valid。所以,最终的判断逻辑是,如果结果为 0,且 g_status 为 Valid,则为真正的 0,如果结果为0,但 g_status 为 Invalid,则为非法输入。

enum Status { Valid, Invalid};
int g_status = Valid;

int Str2Int(const char* str)
{
    g_status = Invalid;
    long long num = 0;
    bool minus = false;
    if (str != NULL && *str != '\0')
    {
        if (*str == '+')
        {
            ++str;
        }
        else if (*str == '-')
        {
            minus = true;
            ++str;
        }
        if (*str != '\0')
            num = Str2IntHelper(str, minus);
    }
    return (int)num;
}
long long Str2IntHelper(const char* digit, bool minus)
{
    long long num = 0;
    int flag = minus ? -1:1;
    while (*digit != '\0')
    {
        if (*digit >= '0' && *digit <= '9')
        {
            num = num*10+flag*(*digit - '0');
            if ( (!minus && num > 0x7fffffff) || (minus && num) < (signed int)0x80000000)
                       // 0x7fff ffff 表示正的最大值
                       // 0x8000 0000 表示负的最小值
                return 0;
            ++str;
        }
        else 
            return 0;
    }
    if (*str == '\0')
                            // 遍历到字符串的末尾
        g_status = Valid;
    return num;
}

客户端调用(测试):

int num = Str2Int("+123");
if (num == 0 && g_status == Invalid)
    非法输入
else
    输出即可
### Python算法面试题常见示例 以下是几个常见的Python算法面试题目及其对应的解决方案: #### 1. 字符串匹配问题 实现个字符串查找函数 `strStr`,该函数接受两个字符串 `haystack` 和 `needle`,如果 `needle` 是 `haystack` 的子串,则返回第个匹配项的索引;否则返回 `-1`。 ```python class Solution: def strStr(self, haystack: str, needle: str) -> int: if not needle: return 0 try: index = haystack.index(needle) except ValueError: index = -1 return index s = Solution() print(s.strStr("hello", "ll")) # 输出:2[^3] ``` --- #### 2. 数组全排列问题 给定个不含重复数字的数组 `nums`,返回其所有可能的全排列。 ```python from typing import List def permute(nums: List[int]) -> List[List[int]]: result = [] if len(nums) == 0: return [[]] for i in range(len(nums)): current_num = nums[i] remaining_nums = nums[:i] + nums[i+1:] for p in permute(remaining_nums): result.append([current_num] + p) return result print(permute([1, 2, 3])) # 输出:[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]][^4] ``` --- #### 3. 反转链表 反转单向链表是个经典的算法问题。下面提供了个简单的实现方式。 ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def reverseList(head: ListNode) -> ListNode: prev = None curr = head while curr: temp_next = curr.next curr.next = prev prev = curr curr = temp_next return prev # 测试代码省略... ``` --- #### 4. 动态规划——斐波那契数列 计算第 n 个斐波那契数,优化时间复杂度至 O(n),空间复杂度降至 O(1)。 ```python def fib(n: int) -> int: if n <= 1: return n a, b = 0, 1 for _ in range(2, n + 1): c = a + b a = b b = c return b print(fib(10)) # 输出:55[^5] ``` --- #### 5. 类型提示 (Type Hinting) 在现代 Python 中,可以利用类型提示来增强代码的可读性和可靠性。 ```python from typing import List def greet_all(names: List[str]) -> None: for name in names: print(f"Hello {name}") greet_all(["Alice", "Bob"]) # 正确调用[^2] ``` --- ### 总结 以上展示了多个经典 Python 算法面试题及其解决方法,涵盖了字符串操作、数组处理、链表反转、动态规划以及类型提示等内容。这些问题不仅有助于理解基本数据结构和算法原理,还能提升实际编程能力。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值