leetcode第一刷_Valid Number

又是那种看上去非常简单,但非常难过的问题,主要是所有的测试用例很难考虑全面。下面我列举出所有的情况:

1. 字符串前面是可以含有空格的,但是全部都是空格是不行的。

2. 一个数字开头可以是哪些字符呢?很容易想到的是“+”和“-”,但是别忘记还有小数点。

3. 一个数字中间也是可以含有字符的,比如科学计数法的“e”,而且e之后是可以接“+”或者“-”的。但是要注意e是不是作为数字的开头或者结尾的。

4. 一个数字的结尾可以由空格,但必须全是空格,不能再接其他的字符。

5. 一个数字中“e”的个数不能多于一个,小数点也最多一个,小数点可以作为数子的结尾但是不能作为开头。

写的乱七八糟的。这种题目应该先想清楚测试用例再写,而不是看到测试用例再修改代码,血的教训啊。

bool isNum(char a){
    if(a>=‘0‘ && a<=‘9‘)
        return true;
    return false;
}
class Solution {
public:
    bool isNumber(const char *s) {
        if(s[0] == ‘\0‘)
            return false;
        int start = 0;
        while(s[start] == ‘ ‘)
            start++;
        if(s[start] == ‘\0‘)
            return false;
        if(s[start] == ‘+‘ || s[start] == ‘-‘){
            if(!isNum(s[start+1])&&!(s[start+1]==‘.‘&&isNum(s[start+2])))
                return false;
            else
                start++;
        }
        bool point = false;
        bool pe = false;
        for(int i=start;s[i]!=‘\0‘;i++){
            if(isNum(s[i])) continue;
            if(s[i] == ‘ ‘){
                while(s[i] == ‘ ‘)
                    i++;
                if(s[i] != ‘\0‘)
                    return false;
                else
                    return true;
            }
            if(s[i] == ‘.‘&&!point&&((i>0&&s[i+1]==‘e‘)||isNum(s[i+1])||(i>0&&isNum(s[i-1])))){
                point = true;
                continue;
            }
            else if(s[i] == ‘e‘&&!pe&&i>0&&(isNum(s[i-1])||s[i-1]==‘.‘)){
                if(!isNum(s[i+1])&&((s[i+1] == ‘+‘||s[i+1] == ‘-‘)&&isNum(s[i+2])))
                    i++;
                else if(!isNum(s[i+1]))
                    return false;
                pe = true;
                point = true;
                continue;
            }else
                return false;
        }
        return true;
    }
};

leetcode第一刷_Valid Number,布布扣,bubuko.com

时间: 2025-01-21 17:55:38

leetcode第一刷_Valid Number的相关文章

leetcode第一刷_Valid Sudoku

一开始没看清题,以为让当场求数独呢,吓得一直没敢做.后来发现这个题原来如此之简单,只要判断现在棋盘上的数字满不满足情况要求就可以了. 这不就是三次循环吗..看看每一行满不满足,每一列满不满足,每个小的3*3的格子满不满足就行了.每个小3*3格子我是用求得左上角的方法来验证的. 其实觉得数独难还有一个原因是记得他在编程之美上出现过..那上面讨论的主要是怎样构造一个数独,具体记不太清楚了,印象最深的是,要想保证有解,最好的办法是先用置换法生成一个解,然后去掉这个解中的一些位置. class Solu

leetcode第一刷_Single Number II

其他出现两次,只有一个出现一次的那道题我就不更了,直接抑或,最后的结果就是那个数.为什么可以这样做呢?因为一个32位int,如果所有数都出现了两次,那么为1的那些位统计的个数一定是2的倍数,抑或之后全变成0.一个数出现了一次,它为1的那些位上,1的个数必定是奇数,抑或之后一定还是1. 我之前知道出现两次这个题的解法,但是理解的不够深,以为抑或是关键,其实不是,出现了偶数次才是关键.理解了这点,推广到出现3次上,如果所有的出现了三次,那么为1的那些位1的个数一定是三的倍数,那如果有一个数出现了一次

leetcode第一刷_Letter Combinations of a Phone Number

水题.数字一共就9个,去掉1是用来显示标点的,剩下8个. 穷举一下map,然后有几个数字,就输出这几个数字的排列,是一个dfs嘛. map<char, string> num; void allCombinations(string &digits, int start, int len, string &pres, vector<string> &res){ if(len == digits.length()){ res.push_back(pres);

leetcode第一刷_Binary Tree Inorder Traversal

递归实现当然太简单,也用不着为了ac走这样的捷径吧..非递归实现还挺有意思的. 树的非递归遍历一定要借助栈,相当于把原来编译器做的事情显式的写出来.对于中序遍历,先要訪问最左下的节点,一定是进入循环后,不断的往左下走,走到不能走为止,这时候,能够从栈中弹出訪问的节点,相当于"左根右"过程的"根",然后应该怎么做呢?想一下中序遍历完根节点之后应该干嘛,对,是走到右子树中继续反复这个过程,可是有一点,假设这个节点不包括右子树怎么办?这样的情况下,下一个应该訪问的节点应该

leetcode第一刷_Sqrt(x)

这道题乍看下来非常简单,实际上要注意的问题非常多. 注意看给出来的函数的接口,返回的是int值,也就是计算结果是个近似值.怎样求呢?难道是从2开始往上算?直到某个值正好接近x?当然不行,肯定超时了.再仔细想一下,对了,有二分法,从最大的开始,每次计算一下平方,如果结果比x大,那么缩短上界,否则提高下界. 思想很正确,下面的问题是最大的那个值是多少?你会毫不犹豫的说出是x啊,x的平方根肯定比x小吧.好,那如果x是INT_MAX呢,你想用什么类型来存储这个平方的结果?而且这样每次减半,也得好一会儿才

leetcode第一刷_Subsets II

要求子集,有非常现成的方法.N个数,子集的个数是2^N,每个元素都有在集合中和不在集合中两种状态,这些状态用[0,pow(2,N)]中每个数来穷举,如果这个数中的第i位为1,说明当前集合中包含源数组中的第i个数. 至于有没有重复的元素,大部分有重复元素的问题,都可以借助一个vis集合,里面存放所有已经求得的集合或者其他形式的解,只有少数题目会超时,哪些问题具体的说. class Solution { public: vector<vector<int> > subsetsWithD

leetcode第一刷_Decode Ways

这道题还挺难的.递归的思路是好想,不过不出意料的超时了. dp嘛.想一下i-1的编码加上第i个编码会怎样,如果加上的这个编码不是0,那么这一位可以独立解码,那长为i的解码个数至少是长为i-1的解码个数.还有呢?如果i-1位是1,可以把i-1位和i位同时解码出来,还有呢?如果i-1位是2而i位是0-6中的数字,也可以同时解码这两位编码.满足这个条件的时候,当前长度的解码个数还要加上i-2时的解码个数. 完全可以用一个数组存放过去的结果,但是很明显,当前的结论只与前一个和前前一个结果有关系.只要用三

leetcode第一刷_Gray Code

说到格雷码,应该没人不知道,具体它有什么用,我还真不是很清楚,我室友应该是专家.生成的规律不是很明显,之前看到帖子讲的,这会儿找找不到了.. 思想是这样的,如果有n位,在第2^(n-1)个编码下面画一条水平线的话,你会发现除了第一位之外,其他位都是关于这条线对称的,如下,以三位格雷码举例: 000 001 011 010 --------------------- 110 111 101 100 很神奇吧,我以前是不知道这个规律的.从一开始的一位格雷码,0,1,开始,每次对称的在上一个前面添加上

leetcode第一刷_Permutation Sequence

这道题还挺好的,如果你的思路是每次生成一个全排列,然后累计到k次,那么停下来吧,肯定超时了亲.. 微软今年的笔试题里有一道类似的,我之前已经提到过了,是只有0和1的字符串,求第k个排列是什么样子的.这道题比那个要难一些,但是总体的思路是一样的.假设有n个数要组成排列,求第k个排列.像填表一样,从高位往地位,逐个填写.先考虑有n-1个数要组成排列,最多有(n-1)!种情况,当第n个数加入后,第n个数可以是从1增加到n的,没增加1,所包含的全排列数就会增加(n-1)!,因此,如果用k/(n-1)!,