算法进修Day-33
65. 有效数字
难度:困难
题目要求
有效数字(按顺序)可以分成以下几个部分:
- 一个 小数 或者 整数
- (可选)一个
'e'
或'E'
,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(
'+'
或'-'
) - 下述格式之一:
- 至少一位数字,后面跟着一个点
'.'
- 至少一位数字,后面跟着一个点
'.'
,后面再跟着至少一位数字 - 一个点
'.'
,后面跟着至少一位数字
- 至少一位数字,后面跟着一个点
整数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(
'+'
或'-'
) - 至少一位数字
部分有效数字列举如下:["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]
部分无效数字列举如下:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]
给你一个字符串 s
,如果 s
是一个 有效数字 ,请返回 true
。
示例1
输入:s = "0"
输出:true
示例2
输入:s = "e"
输出:false
示例3
输入:s = "."
输出:false
题解
可以直接使用正则表达式进行匹配,
^\s*-?\d+(\.\d+)?([eE][-+]?\d+)?\s*$
为当前正确得正则表达式,解读如下:
^\s*
表示以零个、一个或多个空格开头-?
表示一个可选的负号\d+
表示一个或多个的数字(\.\d+)?
表示一个可选的小数部分,包括一个小数点和至少一个数字([eE][-+]?\d+)?
表示科学计数法,包括"e"
或"E"
,可选的正负号和至少一个数字\s*
表示以零个、一个或多个空字符$
表示结尾
想法代码
Csharp
using System.Text.RegularExpressions;
class Solution
{
private static Regex compare = new Regex(@"^\s*-?\d+(\.\d+)?([eE][-+]?\d+)?\s*$");
public static void Main(String[] args)
{
string s = "e";
Solution solution = new Solution();
Console.WriteLine(solution.IsNumber(s));
}
public bool IsNumber(string s)
{
return compare.IsMatch(s);
}
}
66. 加一
难度:简单
题目要求
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例1
输入:digits = [1,2,3]
输出:[1,2,4]
示例2
输入:digits = [4,3,2,1]
输出:[4,3,2,2]
示例3
输入:digits = [0]
输出:[1]
题解
定义 i n d e x = d i g i t s . L e n g t h − 1 index=digits.Length-1 index=digits.Length−1,如果数组中 i n d e x index index 位置为
9
,那么将 i n d e x index index 前移如果 i n d e x = = 0 & & d i g i t s [ i n d e x ] = = 9 index==0 \&\& digits[index]==9 index==0&&digits[index]==9,那么对数组扩容, i n d e x index index 位置的内容变为
1
且对之后的所有元素变为0
,如果 i n d e x = = 0 & & d i g i t s [ i n d e x ] ≠ 9 index==0\&\&digits[index]\neq9 index==0&&digits[index]=9 那么将 i n d e x + 1 index+1 index+1并对之后的元素变为0
如果不满足上方条件,则将最后一个元素加一
想法代码
Csharp
class Solution
{
public static void Main(String[] args)
{
int[] digits = { 8,9 };
Solution solution = new Solution();
int[] res = solution.PlusOne(digits);
for (int i = 0; i < res.Length; i++)
{
Console.Write(res[i] + " ");
}
}
public int[] PlusOne(int[] digits)
{
int index = digits.Length - 1;
if (digits[digits.Length - 1] == 9)
{
if (digits.Length > 1)
{
while (true)
{
if (index == 0)
{
break;
}
if (digits[index] == 9)
{
index--;
}
else
{
break;
}
}
}
if (index == 0 && digits[index] == 9)
{
Array.Resize(ref digits, digits.Length + 1);
digits[index] = 1;
}
else
{
digits[index] += 1;
}
for (int i = digits.Length - 1; i > index; i--)
{
digits[i] = 0;
}
}
else
{
digits[digits.Length - 1] += 1;
}
return digits;
}
}