由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 我觉得valid number其实并不难
相关主题
发现valid number真是必杀题Interleave Strings那个题目有O(n)时间 O(1)空间算法么?
写了一下leetcode上Valid Number,用boolean表示一些状态是不是比较简单讨论一道G的题find longest substring which contains just two unique characters.
leetcode是不是最近有点问题?专家们,find the longest common substring of two strings
报个微软的Offer贴几道某大公司的面试题
leetcode online judge Longest Palindromic Substring memory limit exceededEbay二电面,铁挂了,这回求安慰吧。。。
请教一个Palindrome Partition问题ebay第一轮电话面经
finds all repeated substrings in the string --- YAHOO interview question为什么面试很多,可是一面程序就挂?
请教一道题目L家电面
相关话题的讨论汇总
话题: start话题: string话题: return话题: end话题: isinteger
进入JobHunting版参与讨论
1 (共1页)
z*******3
发帖数: 13709
1
五个步骤
0)预处理,把输入的string给trim一下,这个适用于任何string作为输入的问题
1)写出is unsigned integer的方法
2)写出is integer的方法,借用步骤1写好的方法,加一个判断是不是+-号开头
3)写出is unsigned double的方法,借用步骤1写好的方法
这里有一个很特殊的corner case,就是.单独出现的情况,其实整个流程就这一个
corner case
4)写出is double的方法,借用步骤3写好的方法
5)然后valid number根据e做切割
e后面必需是integer,用步骤2的方法
e前面必需是double,用步骤4的方法
搞定
看起来很长,其实没啥东西,甚至没有脑筋急转弯的地方,就一个corner case记住就
好了
如果可以自由选择java类库的话,double.parseDouble(String)和integer.parseInt(
String)
加上try catch exception block,简简单单搞定一大串内容
废话说完咯,以下是代码
public class Solution {
public boolean isNumber(String s) {
// Start typing your Java solution below
// DO NOT write main() function
s=s.trim();
if(s.indexOf('e')==-1){
return isDouble(s);
}else{
return isDouble(s.substring(0,s.indexOf('e')))
&& isInteger(s.substring(s.indexOf('e')+1));
}
}
private boolean isDouble(String s){
if(s.startsWith("+")||s.startsWith("-")) return isUnsignedDouble(s.
substring(1));
else return isUnsignedDouble(s);
}
private boolean isUnsignedDouble(String s){
if(s.indexOf('.')==-1){
return isUnsignedInteger(s);
}else{
if(s.length()==1) return false;
int i = s.indexOf('.');
return (s.substring(0,i).equals("")||isUnsignedInteger(s.
substring(0,i)))&&
(s.substring(i+1).equals("")||isUnsignedInteger(s.substring(i+1)
));
}
}
private boolean isInteger(String s){
if(s.startsWith("+")||s.startsWith("-")) return isUnsignedInteger(s.
substring(1));
else return isUnsignedInteger(s);
}
private boolean isUnsignedInteger(String s){
if(s.length()==0) return false;
for(int i=0;i if(!Character.isDigit(s.charAt(i))) return false;
}
return true;
}
}
p*****2
发帖数: 21240
2
大牛用C写一个看看?
z*******3
发帖数: 13709
3
“面试用c类语言就是自虐”
--北京二爷

【在 p*****2 的大作中提到】
: 大牛用C写一个看看?
s********x
发帖数: 914
4
建议不要用substring, pass in original string and start/end index

【在 z*******3 的大作中提到】
: 五个步骤
: 0)预处理,把输入的string给trim一下,这个适用于任何string作为输入的问题
: 1)写出is unsigned integer的方法
: 2)写出is integer的方法,借用步骤1写好的方法,加一个判断是不是+-号开头
: 3)写出is unsigned double的方法,借用步骤1写好的方法
: 这里有一个很特殊的corner case,就是.单独出现的情况,其实整个流程就这一个
: corner case
: 4)写出is double的方法,借用步骤3写好的方法
: 5)然后valid number根据e做切割
: e后面必需是integer,用步骤2的方法

A******g
发帖数: 612
5
大牛,你的做法写起来简单但不是算法最优,
一次indexOf扫过整个String
这样整个String扫了很多次了
最优的算法就是实现一个dfa,
整个string只扫一次,时间n,空间n,不好写的
其实用scheme (number? x) 连空格11个字符

【在 z*******3 的大作中提到】
: 五个步骤
: 0)预处理,把输入的string给trim一下,这个适用于任何string作为输入的问题
: 1)写出is unsigned integer的方法
: 2)写出is integer的方法,借用步骤1写好的方法,加一个判断是不是+-号开头
: 3)写出is unsigned double的方法,借用步骤1写好的方法
: 这里有一个很特殊的corner case,就是.单独出现的情况,其实整个流程就这一个
: corner case
: 4)写出is double的方法,借用步骤3写好的方法
: 5)然后valid number根据e做切割
: e后面必需是integer,用步骤2的方法

u*****o
发帖数: 1224
6
MARK一下,以后看到这题再仔细看。
s********x
发帖数: 914
7
用同样的思路写了一个,没有测,可能有小bug。但应该是只扫一遍。
private static boolean isWhiteSpace(char c) {
if (c == ' ' || c == '\t') {
return true;
}

return false;
}

public static boolean isNumber(String s) {
if (s == null || s.length() == 0) {
throw new IllegalArgumentException();
}
int start = 0, end = s.length() - 1;
// trim
while ((end-1) >= 0 && isWhiteSpace(s.charAt(end))) {
end--;
}
while ((start+1) <= end && isWhiteSpace(s.charAt(start))) {
start++;
}
// skip beginning + or -
if ((start+1) <= end && s.charAt(start) == '+' || s.charAt(start) == '-') {
start++;
}
start = isInteger(start, end, s);
if (start < 0) {
return false;
}
if (start+1 <= end && s.charAt(start) == '.') {
start++; // now it's a double
}
start = isInteger(start, end, s);
if (start < 0) {
return false;
}
if (start+1 <= end && s.charAt(start) == 'e') {
start++; // now the rest has to be integer
}
start = isInteger(start, end, s);
return start >0 && start == end && s.charAt(start) <= '9' && s.charAt(
start) >= '0';
}
private static int isInteger(int start, int end, String s) {
if (start > end || s.charAt(start) < '0' || s.charAt(start) > '9') {
return -1; // invalid
}
while ((start+1) <= end && s.charAt(start) <= '9' && s.charAt(start) >= '0
') {
start++;
}
return start;
}

【在 A******g 的大作中提到】
: 大牛,你的做法写起来简单但不是算法最优,
: 一次indexOf扫过整个String
: 这样整个String扫了很多次了
: 最优的算法就是实现一个dfa,
: 整个string只扫一次,时间n,空间n,不好写的
: 其实用scheme (number? x) 连空格11个字符

c********p
发帖数: 1969
8
这个id是你的马甲??
这个题。。。我做的乱七八糟的。。。
A******g
发帖数: 612
9
大牛,随便看了一眼,至少过不了 +.33 这样的

【在 s********x 的大作中提到】
: 用同样的思路写了一个,没有测,可能有小bug。但应该是只扫一遍。
: private static boolean isWhiteSpace(char c) {
: if (c == ' ' || c == '\t') {
: return true;
: }
:
: return false;
: }
:
: public static boolean isNumber(String s) {

s********x
发帖数: 914
10
我不认为那是valid number,应该是0.33

【在 A******g 的大作中提到】
: 大牛,随便看了一眼,至少过不了 +.33 这样的
相关主题
请教一个Palindrome Partition问题Interleave Strings那个题目有O(n)时间 O(1)空间算法么?
finds all repeated substrings in the string --- YAHOO interview question讨论一道G的题find longest substring which contains just two unique characters.
请教一道题目专家们,find the longest common substring of two strings
进入JobHunting版参与讨论
A******g
发帖数: 612
11
大牛,
我们面试时不能以我们认为为准吧?
leetcode认为,几乎所有的programming language都认为比如java,python
这题各种奇怪的边角情况才是难点
比如:
+.33
3.
.3e.3
+.3e10
-3.e.4
这个正则表达式是
Space := ('n'|'t'|' ')
Sign := ('-'|'+')
DOT := '.'
Digit := ('0'|...|'9')
NUMBER := Space* Sign? ((Digit Digit* DOT? Digit*)|(Digit* DOT? Digit Digit*
)) (Space* | (E Sign? ((Digit Digit* DOT? Digit*)|(Digit* DOT? Digit Digit*
Space*))))
不是寥寥几行就能搞定的, 我认为用java的正则表达式靠谱一点

【在 s********x 的大作中提到】
: 我不认为那是valid number,应该是0.33
s********x
发帖数: 914
12
if you insist:
public static boolean isNumber(String s) {
if (s == null || s.length() == 0) {
throw new IllegalArgumentException();
}
int start = 0, end = s.length() - 1;
// trim
while ((end-1) >= 0 && isWhiteSpace(s.charAt(end))) {
end--;
}
while ((start+1) <= end && isWhiteSpace(s.charAt(start))) {
start++;
}
// skip beginning + or -
if ((start+1) <= end && s.charAt(start) == '+' || s.charAt(start) == '-') {
start++;
}
start = isInteger(start, end, s);
if (start < 0) {
return false;
}
boolean hasDot = false;
if (start+1 <= end && s.charAt(start) == '.') {
start++; // now it's a double
hasDot = true;
}
start = isInteger(start, end, s);
if (start < 0) {
return false;
}
if (start+1 <= end && s.charAt(start) == 'e') {
start++; // now the rest has to be integer
}
start = isInteger(start, end, s);
if (start < 0) {
return false;
}
if (s.charAt(start) <= '9' && s.charAt(start) >= '0') {
return true;
}
if (!hasDot && s.charAt(start) == '.') {
return true; // dot occurs only once
}
return false;
}
private static int isInteger(int start, int end, String s) {
if (s.charAt(start) == '.' || s.charAt(start) == 'e') {
return start;
}
if (start > end || s.charAt(start) < '0' || s.charAt(start) > '9') {
return -1; // invalid
}
while ((start+1) <= end && s.charAt(start) <= '9' && s.charAt(start) >= '0
') {
start++;
}
return start;
}

【在 A******g 的大作中提到】
: 大牛,
: 我们面试时不能以我们认为为准吧?
: leetcode认为,几乎所有的programming language都认为比如java,python
: 这题各种奇怪的边角情况才是难点
: 比如:
: +.33
: 3.
: .3e.3
: +.3e10
: -3.e.4

z*******3
发帖数: 13709
13
leetcode上不让用Pattern.matches(String,String)
这题就算要用regulare expression
也没有必要跟这个公式死磕
正则表达式写is integer/is double这些方法都超简单,也很好记
拆开,一点一点实现
上来就给一个复杂的公式,那多半就是背题背的

【在 A******g 的大作中提到】
: 大牛,
: 我们面试时不能以我们认为为准吧?
: leetcode认为,几乎所有的programming language都认为比如java,python
: 这题各种奇怪的边角情况才是难点
: 比如:
: +.33
: 3.
: .3e.3
: +.3e10
: -3.e.4

z*******o
发帖数: 4773
14
不错
A******g
发帖数: 612
15
大牛,哥们我并不是不会写这题,只是觉得这题要一次bugfree或者几乎bugfree还是有
难度的, 背题不至于,上过编译原理或者自动机和形式语言课的看一眼就能写出这个表
达式,基本功而已

【在 z*******3 的大作中提到】
: leetcode上不让用Pattern.matches(String,String)
: 这题就算要用regulare expression
: 也没有必要跟这个公式死磕
: 正则表达式写is integer/is double这些方法都超简单,也很好记
: 拆开,一点一点实现
: 上来就给一个复杂的公式,那多半就是背题背的

z*******3
发帖数: 13709
16
没有说你不懂啊,只是条条大路通罗马
考察面不一样,这种题目如果出在一般的developer面前
就是实现题
编译原理现在被从核心课中拿掉了
对于一些major比如software engineering来说
对于ce的同学可能还比较重要
形式语言应该一直都是选修课

【在 A******g 的大作中提到】
: 大牛,哥们我并不是不会写这题,只是觉得这题要一次bugfree或者几乎bugfree还是有
: 难度的, 背题不至于,上过编译原理或者自动机和形式语言课的看一眼就能写出这个表
: 达式,基本功而已

v*****d
发帖数: 348
17
这题俺看了五分钟直接pass了,没有欲望写

【在 z*******3 的大作中提到】
: 五个步骤
: 0)预处理,把输入的string给trim一下,这个适用于任何string作为输入的问题
: 1)写出is unsigned integer的方法
: 2)写出is integer的方法,借用步骤1写好的方法,加一个判断是不是+-号开头
: 3)写出is unsigned double的方法,借用步骤1写好的方法
: 这里有一个很特殊的corner case,就是.单独出现的情况,其实整个流程就这一个
: corner case
: 4)写出is double的方法,借用步骤3写好的方法
: 5)然后valid number根据e做切割
: e后面必需是integer,用步骤2的方法

d******e
发帖数: 164
18
抛个砖:
bool isNumber(const char *s) {
while (isspace(*s)) s++;
if (*s == '+' || *s == '-') s++;
bool num = false;
while (isdigit(*s)) s++, num = true;
if (*s == '.') {
s++;
while (isdigit(*s)) s++, num = true;
}
if (*s == 'e' && num) {
s++, num = false;
if (*s == '+' || *s == '-') s++;
while (isdigit(*s)) s++, num = true;
}
while (isspace(*s)) s++;
return !*s && num;
}

【在 p*****2 的大作中提到】
: 大牛用C写一个看看?
A******g
发帖数: 612
19
所以说这题对我等ds是必杀题,想放我等过也行,不想放也很容易
当然对大牛显然不是问题,绝对秒杀
这题99.9999%的某文明古国的人肯定做不对

【在 z*******3 的大作中提到】
: 没有说你不懂啊,只是条条大路通罗马
: 考察面不一样,这种题目如果出在一般的developer面前
: 就是实现题
: 编译原理现在被从核心课中拿掉了
: 对于一些major比如software engineering来说
: 对于ce的同学可能还比较重要
: 形式语言应该一直都是选修课

x*****0
发帖数: 452
20
mark
1 (共1页)
进入JobHunting版参与讨论
相关主题
L家电面leetcode online judge Longest Palindromic Substring memory limit exceeded
关于atoi的overflow请教一个Palindrome Partition问题
问2道面试题finds all repeated substrings in the string --- YAHOO interview question
这段代码啥意思?看了半天没看懂。郁闷中~~~~~~~~~~请教一道题目
发现valid number真是必杀题Interleave Strings那个题目有O(n)时间 O(1)空间算法么?
写了一下leetcode上Valid Number,用boolean表示一些状态是不是比较简单讨论一道G的题find longest substring which contains just two unique characters.
leetcode是不是最近有点问题?专家们,find the longest common substring of two strings
报个微软的Offer贴几道某大公司的面试题
相关话题的讨论汇总
话题: start话题: string话题: return话题: end话题: isinteger