[LeetCode30] Day28 - 65. Valid Number

题目

给定一个string s, 判断能不能解释成十进制数字。

题目很好心得列了用来作有效的十进制的字元:

  • Numbers 0-9
  • Exponent 'e'
  • Positive/negative sign '+' / '-'
  • Decimal point '.'

解释

以上有4个,我们为每个宣告一个bool,并从index=0开始,哪个有就变为true,没有则false,然後看看是否符合规则。分别是 numberexpsignpoint

以下分别遇到的情况:

  • number
    • 出现数字,则number变true
  • Iexp
    • exp前面一定要有数字,所以number如果是false,就回传false。
    • 反之将exp变为true
      • exp前的数字可以是 正数、负数,可以有小数点,所以我们就将另外3个变false。
      • 因为後续还需要有出现数字才行。那exp後的数字只能是正负数,小数不行。这部分在小数那判断
  • sign
    • sign一定出现在数字前,所以如果numberpoint是true,则回传false
    • sign如果是false,则变true,反之代表出现第二次了,回传false
  • point
    • 前面说exp後不能出现小数点,所以这里判断如果exp是true,则回传false。
    • point如果是false,则变true,反之代表出现第二次了,回传false。

如果是这些以外的字元,则会跳出回圈。

  • 那在进入回圈之前,因为string中可能有空白 ' ',所以先让idx跑到非空白的位置。
  • 那回圈完,做一样的事情,如果只剩空白,就一定能跑到最後(idx== s.size()),number又是true的话,则回传true。
  • 不能跑到最後,就代表有其他的字元啦('a','b',...),那就一定不能解释成有效的十进制数字,所以回传false。

Code

class Solution {
public:
    bool isNumber(string s) {
        bool exp = false;
        bool number = false;
        bool sign = false;
        bool point = false;
        int idx = 0;
        
        for(idx = 0; idx < s.size() && s[idx] == ' '; idx++);
        
        for(; idx < s.size(); idx++){
            if(isdigit(s[idx])) {
                number = true;
            }    
            else if(s[idx] == '+' || s[idx] == '-'){
                if (number || point){
                    return false;
                }
                if (!sign){
                    sign = true;
                }
                else{
                    return false;
                }
            }
            else if(s[idx] == '.'){
                if (exp){
                    return false;   
                }
                if (!point){
                    point = true;
                }
                else{
                    return false;
                }
            }
            else if(s[idx] == 'e'){
                if(!number){
                    return false;
                }
                if(!exp){
                    exp = true;
                }
                else{
                    return false;
                }
                sign = false;
                point = false;
                number = false;
            }
            else{
                break;
            }
        }
        for(; idx < s.size() && s[idx] == ' '; idx++);
        return number && idx == s.size();
    }
};

https://ithelp.ithome.com.tw/upload/images/20201013/201291472yudi10z3E.png


<<:  拯救资工系学生的基本素养—精进 C/C++ 的学习资源

>>:  28/AWS SSA面试经验分享(上)

Day 06:小孩子才做选择-BootstrapVue 全部引入

本篇开始终於要进入解决需求的前置作业了!首先需要让网站有个基本的置顶导览列,让我们有请 Bootst...

Day12 React -Events

在 React中处理事件就像 HTML 一样,React 可以根据用户事件执行动作。 具有与 HTM...

爬虫怎麽爬 从零开始的爬虫自学 DAY15 python回圈

前言 各位早安,书接上回我们说到条件运算式的用法,今天我们要来介绍程序设计另一个非常重要的工具 回圈...

[C 语言笔记--Day09] 解题纪录:Moamen and k-subarrays

https://codeforces.com/contest/1557/problem/B 程序码:...

Day15-旧网站重写成Vue_6_多图片轮播

先写时间轮播的部分 一样先做一个data预设 data: { time: [0, 3, 4, 2, ...