剑指offer (49) 字符串转数字

class Test {
    public:
        Test() : n2(0), n1(n2 + 2) { }
    private:
        int n1;
        int n2;
};

调用构造函数之后,n1个n2各为多少?

分析:构造函数的初始化顺序仅仅取决于成员变量的声明顺序,所以这是 应该是 n1先初始化,然后是n2初始化

当n1初始化值 = n2值 + 2,此时n2并没有初始化,n2为内置类型并且是non-static,所以n2此时为随机值

故 n1 为随机值,n1初始完之后,n2初始化为0

最终 n1为随机值,n2为0

字符串转为数字:

需要考虑以下几点:

1. 输入字符串指针为NULL,如果输入为NULL,则返回0,而输入为‘0‘时也返回0,所以应该设置一个全局变量来区分

2. 输入为空字符串

3. 正负号,并且字符串只有一个负号的问题: ‘-‘

4. 字符不是介于 ‘0‘ 至 ‘9‘ 之间

5. 溢出判断

long long StrToIntCore(const char* str, bool minus);

enum Status {kValid = 0, kInvalid};
int g_nStatus = kValid;

int StrToInt(const char* str)
{
    g_nStatus = kInvalid;
    long long num = 0;

    if(str != NULL && *str != ‘\0‘)
    {
        bool minus = false;
        if(*str == ‘+‘)
            str ++;
        else if(*str == ‘-‘)
        {
            str ++;
            minus = true;
        }

        if(*str != ‘\0‘)
        {
            num = StrToIntCore(str, minus);
        }
    }

    return (int)num;
}

long long StrToIntCore(const char* digit, bool minus)
{
    long long num = 0;

    while(*digit != ‘\0‘)
    {
        if(*digit >= ‘0‘ && *digit <= ‘9‘)
        {
            int flag = minus ? -1 : 1;
            num = num * 10 + flag * (*digit - ‘0‘);

            if((!minus && num > 0x7FFFFFFF)
                || (minus && num < (signed int)0x80000000))
            {
                num = 0;
                break;
            }

            digit++;
        }
        else
        {
            num = 0;
            break;
        }
    }

    if(*digit == ‘\0‘)
    {
        g_nStatus = kValid;
    }

    return num;
}

剑指offer (49) 字符串转数字,布布扣,bubuko.com

时间: 2024-12-26 19:39:38

剑指offer (49) 字符串转数字的相关文章

【剑指offer】字符串转整数

转载请注明出处:http://blog.csdn.net/ns_code/article/details/28015693 题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1<= n<=10000000). 输出: 对应每个测试案例,若输入为一个合法的字符串(即代表一个整数),则输出这个整数.若输入为一个非法的字符串,则输出"My God". 样

【剑指offer】Q38:数字在数组中出现的次数

与折半查找是同一个模式,不同的是,在这里不在查找某个确定的值,而是查找确定值所在的上下边界. def getBounder(data, k, start, end, low_bound = False): if end < start : return -1 while start <= end: mid = ( start + end ) >> 1 if data[ mid ] > k: end = mid - 1 elif data[ mid ] < k: star

【剑指offer】字符串的排列

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26390551 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入: 每个测试案例包括1行. 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 输出: 对应每组数据,按字典序输出所有排列. 样例输入: abc BCA 样例输出:

【剑指offer】字符串的组合

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26405471 剑指offer上的拓展题目,输入一个字符串,输出该字符串的字符的所有组合,比如输入字符串:abc,输出a.b.c.ab.ac.bc.abc. 思路:与上一题类似,也可以用递归求解.可以考虑求长度为n的字符串中m个字符的组合,设为C(n,m).原问题的解即为C(n, 1), C(n, 2),...C(n, n)的总和.对于求C(n, m),从第一个字符开始扫描,每个字符有两种

剑指offer (41) 有序数组数字之和

题目:输入一个递增排序的数组和一个数字target,在数组中查找两个数使得它们的和正好是target 题解分析: 一提到有序数组,应该立马联想到 二分查找 因为数组已经有序了,我们可以设置两个游标first和last,下标first指向 0, last指向 size() - 1, 然后相加 如果 相加和 大于 target,last-- 如果 相加和 小于 target,first++ T(n) = O(n) void TwoSum(const std::vector<int>& nu

剑指offer 49.综合 把字符串转换成整数

题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0. 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 示例1 输入 +2147483647 1a33 输出 2147483647 0 解题思路 (1先用一个Map<String, Integer>将0-9的数字封装

剑指offer 把字符串转化为整数

题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 示例1 输入 +2147483647 1a33 输出 2147483647 0 思路:字符串转化为整数的方法num = num * 10 + str[i] - '0':特殊情况:1.输入字符串为NULL: 2.输入字符串只有+/-: 3.转化的数字大于最大值或小于

剑指Offer——把字符串转换成整数

题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 示例1 输入 +2147483647 1a33 输出 2147483647 0 分析: 只可能在最开始一位出现符号,所以我们特殊判断第一位,之后都得是数字字母,不然不合法. 代码: 1 class Solution { 2 public: 3 int StrTo

剑指Offer对答如流系列 - 把数字翻译成字符串

面试题46:把数字翻译成字符串 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻译成"b",--,11翻译成"l",--,25翻译成"z".一个数字可能有多个翻译.例如12258有5种不同的翻译,它们分别"bccfi", "bwfi", "bczi", "mcfi" 和"mzi" .请编程实现一个函