w****x 发帖数: 2483 | 1 去注释
abc//xyz\nwwe*/*sdfsd/*sdfda*/sd*/cvcd => abc\nwwe*sd*/cvcd |
p*****2 发帖数: 21240 | 2
先用\n split成几个string
检查每个string
碰到//的话后边的都干掉
碰到/*的话用个counter,找到搭配的*/
//和/*是要看先碰到谁,以谁为准吧
【在 w****x 的大作中提到】 : 去注释 : abc//xyz\nwwe*/*sdfsd/*sdfda*/sd*/cvcd => abc\nwwe*sd*/cvcd
|
w****x 发帖数: 2483 | 3
加两个限制, 不能用split, 并且是one pass read
【在 p*****2 的大作中提到】 : : 先用\n split成几个string : 检查每个string : 碰到//的话后边的都干掉 : 碰到/*的话用个counter,找到搭配的*/ : //和/*是要看先碰到谁,以谁为准吧
|
a********x 发帖数: 1502 | 4 有限状态自动机
【在 w****x 的大作中提到】 : : 加两个限制, 不能用split, 并且是one pass read
|
w****x 发帖数: 2483 | 5
有点高射炮轰蚊子, 时间很紧的, 把那个状态图画出来时间都过了
【在 a********x 的大作中提到】 : 有限状态自动机
|
a********x 发帖数: 1502 | 6 不然我绝对想不出别的one pass了
【在 w****x 的大作中提到】 : : 有点高射炮轰蚊子, 时间很紧的, 把那个状态图画出来时间都过了
|
R********y 发帖数: 88 | 7 pair up, // 和 \n 一组
/* 和 */ 一组
用string.indexOf method,如果先出现//,从此处开始找\n,中间跳过。
如果先出现/*,从此处开始找*/,中间跳过。
跳过后继续找,直到字串结束
【在 w****x 的大作中提到】 : 去注释 : abc//xyz\nwwe*/*sdfsd/*sdfda*/sd*/cvcd => abc\nwwe*sd*/cvcd
|
w****x 发帖数: 2483 | 8
光有/*没有*/的话"/*"要保留
【在 R********y 的大作中提到】 : pair up, // 和 \n 一组 : /* 和 */ 一组 : 用string.indexOf method,如果先出现//,从此处开始找\n,中间跳过。 : 如果先出现/*,从此处开始找*/,中间跳过。 : 跳过后继续找,直到字串结束
|
p*****2 发帖数: 21240 | 9
感觉这样就差不多了。
【在 R********y 的大作中提到】 : pair up, // 和 \n 一组 : /* 和 */ 一组 : 用string.indexOf method,如果先出现//,从此处开始找\n,中间跳过。 : 如果先出现/*,从此处开始找*/,中间跳过。 : 跳过后继续找,直到字串结束
|
b*******y 发帖数: 2048 | 10 新一代面霸阿。。。面试真多
twitter简历看都没看就把偶据了:(
【在 w****x 的大作中提到】 : 去注释 : abc//xyz\nwwe*/*sdfsd/*sdfda*/sd*/cvcd => abc\nwwe*sd*/cvcd
|
|
|
l*****a 发帖数: 14598 | 11 正常
那地方不怎么招fresh吧
【在 b*******y 的大作中提到】 : 新一代面霸阿。。。面试真多 : twitter简历看都没看就把偶据了:(
|
w****x 发帖数: 2483 | 12
别罗嗦了, 上代码吧
【在 p*****2 的大作中提到】 : : 感觉这样就差不多了。
|
R********y 发帖数: 88 | 13 先出现/*的话,从当前位置找*/,如果返回-1(没找到),从当前位置开始只找//和/n
的pair
【在 w****x 的大作中提到】 : : 别罗嗦了, 上代码吧
|
w****x 发帖数: 2483 | 14
就是问个题而已......
twitter我还没投简历就收到据信了
【在 b*******y 的大作中提到】 : 新一代面霸阿。。。面试真多 : twitter简历看都没看就把偶据了:(
|
l*****a 发帖数: 14598 | 15 没申请为什么悲剧?
【在 w****x 的大作中提到】 : : 就是问个题而已...... : twitter我还没投简历就收到据信了
|
p*****2 发帖数: 21240 | 16
我准备写写这个。假设输入是合法的。
【在 w****x 的大作中提到】 : : 就是问个题而已...... : twitter我还没投简历就收到据信了
|
w****x 发帖数: 2483 | 17
/n
如果没找到那不是又要从第一次/*的位置开始write? 就不是one pass了
【在 R********y 的大作中提到】 : 先出现/*的话,从当前位置找*/,如果返回-1(没找到),从当前位置开始只找//和/n : 的pair
|
w****x 发帖数: 2483 | 18
知道我会申请, 抢在申请前先把据信发了省的以后麻烦....
【在 l*****a 的大作中提到】 : 没申请为什么悲剧?
|
p*****2 发帖数: 21240 | 19
我觉得应该假设是合法的输入吧?
/* 必能找到 */
//必能找到/n或者字符串结束
这个assumption正确吗?
【在 w****x 的大作中提到】 : : 知道我会申请, 抢在申请前先把据信发了省的以后麻烦....
|
w****x 发帖数: 2483 | 20
为什么/*abcddfa 不合法呢??
这个情况需要考虑进去, 编译器作预处理的时候不能假定用户输入的都是合法程序啊
【在 p*****2 的大作中提到】 : : 我觉得应该假设是合法的输入吧? : /* 必能找到 */ : //必能找到/n或者字符串结束 : 这个assumption正确吗?
|
|
|
l*****a 发帖数: 14598 | 21 不能这么假设
否则所有题目的异常判断都可以省略了
【在 p*****2 的大作中提到】 : : 我觉得应该假设是合法的输入吧? : /* 必能找到 */ : //必能找到/n或者字符串结束 : 这个assumption正确吗?
|
p*****2 发帖数: 21240 | 22
/*abcddfa
这个东西代表什么呢?没有注释?
【在 w****x 的大作中提到】 : : 为什么/*abcddfa 不合法呢?? : 这个情况需要考虑进去, 编译器作预处理的时候不能假定用户输入的都是合法程序啊
|
w****x 发帖数: 2483 | 23
我晕, 不管它代表什么, 输入是/*asd 输出还是/*asd
【在 p*****2 的大作中提到】 : : /*abcddfa : 这个东西代表什么呢?没有注释?
|
p*****2 发帖数: 21240 | 24
这个不一定吧?要问面试官了。
【在 l*****a 的大作中提到】 : 不能这么假设 : 否则所有题目的异常判断都可以省略了
|
w****x 发帖数: 2483 | 25 /*asd => /*asd
/*asd//safasd*/ => /*asd
/*asdas/*asd*/sd => sd
//asdasd => 空
//asdas/n => /n |
p*****2 发帖数: 21240 | 26
那不就是相当于没有注释吗?
【在 w****x 的大作中提到】 : /*asd => /*asd : /*asd//safasd*/ => /*asd : /*asdas/*asd*/sd => sd : //asdasd => 空 : //asdas/n => /n
|
p*****2 发帖数: 21240 | 27
/*asd//safasd*/ => /*asd
感觉这个应该输出空
【在 w****x 的大作中提到】 : /*asd => /*asd : /*asd//safasd*/ => /*asd : /*asdas/*asd*/sd => sd : //asdasd => 空 : //asdas/n => /n
|
l*****a 发帖数: 14598 | 28 放IDE里面就全知道了
【在 p*****2 的大作中提到】 : : /*asd//safasd*/ => /*asd : 感觉这个应该输出空
|
w****x 发帖数: 2483 | 29
对,就相当于每注释, 我晕, 管它有没有注释, 就相当于实现一个编译器去注释的预处
理程序, 有那么绕吗....
【在 p*****2 的大作中提到】 : : /*asd//safasd*/ => /*asd : 感觉这个应该输出空
|
p*****2 发帖数: 21240 | 30
好像是空的呀。
【在 l*****a 的大作中提到】 : 放IDE里面就全知道了
|
|
|
p*****2 发帖数: 21240 | 31
感觉不是这样。如果你在IDE里搞一个/*abc, IDE是期望后边有一个*/的。
不明白为什么要认为/*abc是合法的。
【在 w****x 的大作中提到】 : : 对,就相当于每注释, 我晕, 管它有没有注释, 就相当于实现一个编译器去注释的预处 : 理程序, 有那么绕吗....
|
w****x 发帖数: 2483 | 32
随便哪种情况了, 写起来是蛮麻烦的
【在 p*****2 的大作中提到】 : : 感觉不是这样。如果你在IDE里搞一个/*abc, IDE是期望后边有一个*/的。 : 不明白为什么要认为/*abc是合法的。
|
p*****2 发帖数: 21240 | 33
看你加入的限定条件是不是为真了。面试的时候可能没有那么多限定条件。
【在 w****x 的大作中提到】 : : 随便哪种情况了, 写起来是蛮麻烦的
|
w****x 发帖数: 2483 | 34
我晕, 不合法IDE也得处理啊, 不能崩溃吧....
比如你写一个
void main()
{}
/*asdfds
IDE会报错, 改成
void main()
{}
/*asdfds*/
就编译通过
【在 p*****2 的大作中提到】 : : 看你加入的限定条件是不是为真了。面试的时候可能没有那么多限定条件。
|
p*****2 发帖数: 21240 | 35
可是IDE并没有要输出去掉comment的程序呀
这里有两步
1. IDE提示语法错误 (保证了语法的正确性)
2. 编译器编译,去掉comments
这题是第二步,也就是说语法应该没问题。如果没有IDE,也是应该先进行语法的检查
才编译吧?你这些输入语法检查就报错了。
【在 w****x 的大作中提到】 : : 我晕, 不合法IDE也得处理啊, 不能崩溃吧.... : 比如你写一个 : void main() : {} : /*asdfds : IDE会报错, 改成 : void main() : {} : /*asdfds*/
|
w****x 发帖数: 2483 | 36
编译器因该先进行预处理在座语法检查吧, 先把注释去掉, 宏做替换等预处理, 预处理
完了在检查语法
和IDE没关系, 假设在用txt文本写程序, 用g++编译
【在 p*****2 的大作中提到】 : : 可是IDE并没有要输出去掉comment的程序呀 : 这里有两步 : 1. IDE提示语法错误 (保证了语法的正确性) : 2. 编译器编译,去掉comments : 这题是第二步,也就是说语法应该没问题。如果没有IDE,也是应该先进行语法的检查 : 才编译吧?你这些输入语法检查就报错了。
|
p*****2 发帖数: 21240 | 37
那你搞一个/*, 编译器怎么搞?
【在 w****x 的大作中提到】 : : 编译器因该先进行预处理在座语法检查吧, 先把注释去掉, 宏做替换等预处理, 预处理 : 完了在检查语法 : 和IDE没关系, 假设在用txt文本写程序, 用g++编译
|
w****x 发帖数: 2483 | 38
/*abc 那就不是注释了啊, 所以/*abc就被保留下来了, 然后编译的时候就被编译器报
错了
【在 p*****2 的大作中提到】 : : 那你搞一个/*, 编译器怎么搞?
|
p*****2 发帖数: 21240 | 39
我怎么感觉先会有个语法检查呢? 不是这样吗?
【在 w****x 的大作中提到】 : : /*abc 那就不是注释了啊, 所以/*abc就被保留下来了, 然后编译的时候就被编译器报 : 错了
|
p*****2 发帖数: 21240 | |
|
|
w****x 发帖数: 2483 | 41
先预处理再编译吧, 这题就算是预处理的范畴, 怎么扯到编译上去了
【在 p*****2 的大作中提到】 : : 没看你程序,感觉你不是扫一遍吧?
|
p*****2 发帖数: 21240 | 42
可能我理解错了。我以为先进行语法检查,再remove comments
你的意思是先remove comments再进行语法检查
难道remove comments这步没有现成的代码吗?还有为什么要求只扫一遍呢?
【在 w****x 的大作中提到】 : : 先预处理再编译吧, 这题就算是预处理的范畴, 怎么扯到编译上去了
|
w****x 发帖数: 2483 | 43
这题...就是要求去除comment这么简单, 你搞那么复杂做什么...
【在 p*****2 的大作中提到】 : : 可能我理解错了。我以为先进行语法检查,再remove comments : 你的意思是先remove comments再进行语法检查 : 难道remove comments这步没有现成的代码吗?还有为什么要求只扫一遍呢?
|
g****y 发帖数: 240 | 44 我来贡献一个python re
re.sub(r"(//.*(?=\\n))|(/\*.*?\*/)", "", r"abc//xyz\nwwe*/*sdfsd/*sdfda*/sd*
/cvcd") |
i*******e 发帖数: 240 | 45 string s = "abc//xyz\nwwe*/*sdfsd/*sdfda*/sd*/cvcd";
int i;
bool isInStarComment = false;
bool isInLineComment = false;
string ans = "";
for (i=0; i
{
if (!isInStarComment && !isInLineComment)
{
if (i+1
{
if (s[i+1] == '/') {isInLineComment = true; i++; continue;}
else if (s[i+1] == '*') {isInStarComment = true; i++;
continue;}
}
ans += s[i];
}
if (isInLineComment)
{
if (s[i]=='\n')
{
isInLineComment = false;
continue;
}
}
if (isInStarComment)
{
if (i+1
{
isInStarComment = false;
i++;
continue;
}
}
} |
n****r 发帖数: 120 | 46 奔一个:
public static String removeComments(String a) {
StringBuilder sb = new StringBuilder();
int i = 0, j = 0;
while (i < a.length()) {
if (a.charAt(i) == '/' && i + 1 < a.length() && (a.charAt(i + 1) ==
'/' || a.charAt(i + 1) == '*')) {
j = i + 2;
boolean pairMatched = false;
boolean lineComment = true;
char[] pair = {'\n'};
if (a.charAt(i+1) == '*'){
lineComment = false;
pair = "*/".toCharArray();
}
while (j < a.length()){
if ((lineComment && a.charAt(j) == pair[0]) || (!lineComment
&& a.charAt(j) == pair[0] && j+1 < a.length() && a.charAt(j+1) == pair[1])){
i = j;
if (!lineComment)
i = j+2;
pairMatched = true;
break;
}
j++;
}
if (!pairMatched){
if (a.charAt(i+1) == '*')
sb.append(a, i, j);
i = j;
}
} else {
sb.append(a.charAt(i));
i++;
}
}
return sb.toString();
} |
b*2 发帖数: 94 | 47 这不是我去年面MSFT的题么T_T...这题磨了我好一阵儿。。。 |
p*****2 发帖数: 21240 | 48
当时什么requirement?
【在 b*2 的大作中提到】 : 这不是我去年面MSFT的题么T_T...这题磨了我好一阵儿。。。
|
b*2 发帖数: 94 | 49
印象里当时的要求是: remove all the comments from a VAID java file 瓦利德 瓦
利德 瓦利德!
/*asd => /*asd <======因为valid, 所以但凡有/*,就肯定可以期待*/的出现,不过
可能在很多行之后。
/*asd//safasd*/ => 全部remove
/*asdas/*asd*/sd => sd
//asdasd => 空
//asdas/n => /n
有种情况是 如果注释是发生在String里,就不能remove它: "String /*String*/" =>
"String /*String*/"
【在 p*****2 的大作中提到】 : : 当时什么requirement?
|
b*2 发帖数: 94 | 50 忘了说了:Assuming this file is VALID 瓦利德。 |
|
|
p*****2 发帖数: 21240 | 51
=>
不错,很详细,跟我想的差不多。多了一种情况很有意思。
【在 b*2 的大作中提到】 : 忘了说了:Assuming this file is VALID 瓦利德。
|
p*****2 发帖数: 21240 | 52
对。我认为可以有这个assumption。这就是我跟LZ纠结的地方。
【在 b*2 的大作中提到】 : 忘了说了:Assuming this file is VALID 瓦利德。
|
d**e 发帖数: 6098 | 53 其实用state machine都是辅助思考,这题跟我在hulu面试那题相似度非常大。
【在 w****x 的大作中提到】 : : 这题...就是要求去除comment这么简单, 你搞那么复杂做什么...
|
l*********8 发帖数: 4642 | 54 我使用g++ 4.3.4 编译如下错误程序:
/*
int main()
{
intt a;
a = 3;
}
直接得到一条error: unterminated comment
并没有报intt 未定义和 a未定义的错误。
所以,去除comment时遇到未配对的 /*, 直接返回错误也可以,不需要试图将 /* 保留
在去除comment后的结果中。 当然,如果面试官非要这么做,我们也只有做。
【在 w****x 的大作中提到】 : : 这题...就是要求去除comment这么简单, 你搞那么复杂做什么...
|
p*****2 发帖数: 21240 | 55
我觉得也是。bq2也证实了。
【在 l*********8 的大作中提到】 : 我使用g++ 4.3.4 编译如下错误程序: : /* : int main() : { : intt a; : a = 3; : } : 直接得到一条error: unterminated comment : 并没有报intt 未定义和 a未定义的错误。 : 所以,去除comment时遇到未配对的 /*, 直接返回错误也可以,不需要试图将 /* 保留
|
l*********8 发帖数: 4642 | 56 弱问啥是bq2
【在 p*****2 的大作中提到】 : : 我觉得也是。bq2也证实了。
|
b*2 发帖数: 94 | 57 =.=||| bq2是小女子。。。。。。面试时也碰到过此题。
【在 l*********8 的大作中提到】 : 弱问啥是bq2
|
d**e 发帖数: 6098 | 58 你和水木的dp2是什么关系?
【在 b*2 的大作中提到】 : =.=||| bq2是小女子。。。。。。面试时也碰到过此题。
|
D**f 发帖数: 439 | 59 很简单的状态机,table driven,最多20分钟能搞定。 |
w****x 发帖数: 2483 | 60
写一个吧, 对这块不是很熟悉
【在 D**f 的大作中提到】 : 很简单的状态机,table driven,最多20分钟能搞定。
|
|
|
l*********8 发帖数: 4642 | 61 呵呵, 我还以为bq2是一个没听说过的编译器呢。 看帖不仔细啊。。。
【在 b*2 的大作中提到】 : =.=||| bq2是小女子。。。。。。面试时也碰到过此题。
|
l*********8 发帖数: 4642 | 62 我写一个 (还没有考虑“”的问题,好像挺复杂)
bool removeComment(char * s)
{
char *r = s, *w = s;
while (r && *r){
if ( !strncmp(r, "/*", 2) ) {
r = strstr(r+2, "*/");
r = (r!=NULL) ? r+2 : r;
} else if ( !strncmp(r, "//", 2) ) {
r = strchr(r+2, '\n');
r = (r!=NULL) ? r : s+strlen(s);
} else {
*w++ = *r++;
}
}
if (w != NULL)
*w = '\0';
return r!=NULL;
} |
h*******e 发帖数: 1377 | 63 2哥的算法可以手动split 就是 i == strLen || isreturn(str[i]) isreturn(str[i-
1]) 不同时候 check 一下 substr(str, segStart, i - segStart ) 把 相应的字符串
拿出来检查
同一行如果先遇到了 // /* 记录下 startPos。 和startType // 期待第一个 /n /*
期待第一个 */ 字符串 内移动 在字符串内保留一个 movPos
每次 遇到 // 前 /n 后 和 / * */不移动 movPos 不移动,否则str[movPos++] =
当前的值 就是one pass的, by the way twitter 离我们公司不远:)那个地方在
twitter 搬过去之后有了很多 穿戴整齐的人,不像以前San Francisco tenderloin街
区到处都是homeless到处游荡了。
【在 w****x 的大作中提到】 : : 写一个吧, 对这块不是很熟悉
|
z******e 发帖数: 82 | 64 // " /*dfsfsdf*/ //fdsfs " is processed.
private static String uncomment(String str) {
boolean slash2 = false;
boolean inStr = false;
boolean slashstar = false;
StringBuilder sb = new StringBuilder();
char lastc = ' ';
char c = ' ';
int deleteStart = -1;
for (int i = 0; i < str.length(); i++) {
lastc = c;
c = str.charAt(i);
sb.append(c);
// ""
if (c == '"') {
inStr = !inStr;
continue;
}
if (!inStr && c == '\n' && slash2) {
slash2 = false;
sb.delete(deleteStart, sb.length() - 1);
deleteStart = -1;
continue;
}
if (!inStr && c == '/') {
// //
if (lastc == '/' && !slash2 && !slashstar) {
deleteStart = sb.length() - 2;
slash2 = true;
continue;
}
// */
if (lastc == '*' && slashstar) {
slashstar = false;
sb.delete(deleteStart, sb.length());
deleteStart = -1;
continue;
}
}
// /*
if (!inStr && c == '*') {
if (lastc == '/' && !slashstar && !slash2) {
deleteStart = sb.length() - 2;
slashstar = true;
continue;
}
}
}
if (slash2 && deleteStart >= 0) {
sb.delete(deleteStart, sb.length());
}
return sb.toString();
}
test
-----------------------------------
abc//xyz\nwwe*/*sdfsdsdfda*/s"/*fdfsf*/df//sfs"dcvcd
abc\nwwe*s"/*fdfsf*/df//sfs"dcvcd
/*asd
/*asd
/*asd//safasd*/
/*asdas/*asd*/sd
sd
//asdasd
//asdas\n
\n
//as/*fdsf*/das\n
\n
/*as//das*/\n
\n |
l*********8 发帖数: 4642 | 65 这里对“的检测是不够的。
【在 z******e 的大作中提到】 : // " /*dfsfsdf*/ //fdsfs " is processed. : private static String uncomment(String str) { : boolean slash2 = false; : boolean inStr = false; : boolean slashstar = false; : StringBuilder sb = new StringBuilder(); : char lastc = ' '; : char c = ' '; : int deleteStart = -1; : for (int i = 0; i < str.length(); i++) {
|
z******e 发帖数: 82 | 66 can you please give a test case?
【在 l*********8 的大作中提到】 : 这里对“的检测是不够的。
|
l*********8 发帖数: 4642 | 67 char c = '"'; /*this is the test for " */
【在 z******e 的大作中提到】 : can you please give a test case?
|
z******e 发帖数: 82 | 68 多谢大牛的test case
private static String uncomment(String str) {
boolean slash2 = false;
boolean inStr = false;
boolean slashstar = false;
StringBuilder sb = new StringBuilder();
char lastc = ' ';
char c = ' ';
int deleteStart = -1;
for (int i = 0; i < str.length(); i++) {
lastc = c;
c = str.charAt(i);
sb.append(c);
// ""
if (c == '"' && !slash2 && !slashstar) {
if (lastc != '\''
|| (i < str.length() - 1 && str.charAt(i + 1) != '\'
')) {
inStr = !inStr;
continue;
}
}
// // xxxxx \n
if (c == '\n' && slash2) {
slash2 = false;
sb.delete(deleteStart, sb.length() - 1);
deleteStart = -1;
continue;
}
if (!inStr && c == '/') {
// //
if (lastc == '/' && !slash2 && !slashstar) {
deleteStart = sb.length() - 2;
slash2 = true;
continue;
}
// */
if (lastc == '*' && slashstar) {
slashstar = false;
sb.delete(deleteStart, sb.length());
deleteStart = -1;
continue;
}
}
// /*
if (!inStr && c == '*') {
if (lastc == '/' && !slashstar && !slash2) {
deleteStart = sb.length() - 2;
slashstar = true;
continue;
}
}
}
if (slash2 && deleteStart >= 0) {
sb.delete(deleteStart, sb.length());
}
return sb.toString();
}
// test cases:
---------------------------
abc//xyz\nwwe*/*sdfsdsdfda*/s"/*fdfsf*/df//sfs"dcvcd
abc\nwwe*s"/*fdfsf*/df//sfs"dcvcd
/*asd
/*asd
/*asd//s"afasd*/
/*asdas/*asd*/sd
sd
//asdasd
//asdas\n
\n
//as/*fdsf*/das\n
\n
/*as//das*/\n
\n
char c = '"'; /*this is the test for " */
char c = '"';
char c = '"
char c = '"
char c = "'; /*this is the test for " */
char c = "'; /*this is the test for " */
char c = '"'
char c = '"' |
l*********8 发帖数: 4642 | 69 Can you try this one?
char str = "// and \"."; // Test for // and " in a string
【在 z******e 的大作中提到】 : 多谢大牛的test case : private static String uncomment(String str) { : boolean slash2 = false; : boolean inStr = false; : boolean slashstar = false; : StringBuilder sb = new StringBuilder(); : char lastc = ' '; : char c = ' '; : int deleteStart = -1; : for (int i = 0; i < str.length(); i++) {
|
z******e 发帖数: 82 | 70 -_-!!, what bad test skill I have.
for this test case, change
if (c == '"' && !slash2 && !slashstar) {
to
if (c == '"' && lastc != '\' && !slash2 && !slashstar) {
complete code:
private static String uncomment(String str) {
boolean slash2 = false;
boolean inStr = false;
boolean slashstar = false;
StringBuilder sb = new StringBuilder();
char lastc = ' ';
char c = ' ';
int deleteStart = -1;
for (int i = 0; i < str.length(); i++) {
lastc = c;
c = str.charAt(i);
sb.append(c);
// ""
if (c == '"' && lastc != '\' && !slash2 && !slashstar) {
if (lastc != '''
|| (i < str.length() - 1 && str.charAt(i + 1) != '''
)) {
inStr = !inStr;
continue;
}
}
// // xxxxx \n
if (c == '\n' && slash2) {
slash2 = false;
sb.delete(deleteStart, sb.length() - 1);
deleteStart = -1;
continue;
}
if (!inStr && c == '/') {
// //
if (lastc == '/' && !slash2 && !slashstar) {
deleteStart = sb.length() - 2;
slash2 = true;
continue;
}
// */
if (lastc == '*' && slashstar) {
slashstar = false;
sb.delete(deleteStart, sb.length());
deleteStart = -1;
continue;
}
}
// /*
if (!inStr && c == '*') {
if (lastc == '/' && !slashstar && !slash2) {
deleteStart = sb.length() - 2;
slashstar = true;
continue;
}
}
}
if (slash2 && deleteStart >= 0) {
sb.delete(deleteStart, sb.length());
}
return sb.toString();
}
test cases:
abc//xyz\nwwe*/*sdfsdsdfda*/s"/*fdfsf*/df//sfs"dcvcd
abc\nwwe*s"/*fdfsf*/df//sfs"dcvcd
/*asd
/*asd
/*asd//s"afasd*/
/*asdas/*asd*/sd
sd
//asdasd
//asdas\n
\n
//as/*fdsf*/das\n
\n
/*as//das*/\n
\n
char c = '"'; /*this is the test for " */
char c = '"';
char c = '"
char c = '"
char c = "'; /*this is the test for " */
char c = "'; /*this is the test for " */
char c = '"'
char c = '"'
char str = "// and "."; // Test for // and " in a string
char str = "// and ".";
【在 l*********8 的大作中提到】 : Can you try this one? : char str = "// and \"."; // Test for // and " in a string
|
|
|
l*********8 发帖数: 4642 | 71 Well, can you try this one:
char str[] = "\\"; // test \ inside "
【在 z******e 的大作中提到】 : -_-!!, what bad test skill I have. : for this test case, change : if (c == '"' && !slash2 && !slashstar) { : to : if (c == '"' && lastc != '\' && !slash2 && !slashstar) { : complete code: : private static String uncomment(String str) { : boolean slash2 = false; : boolean inStr = false; : boolean slashstar = false;
|
z******e 发帖数: 82 | 72 new test cases:
--------------------
char str[] = "\\"; // test \ inside "
char str[] = "\\";
char str[] = '\"'; // test \ inside "
char str[] = '\"';
code:
---------------------------
private static String uncomment(String str) {
boolean slash2 = false;
boolean inStr = false;
boolean slashstar = false;
boolean escape = false;
StringBuilder sb = new StringBuilder();
char lastc = ' ';
char c = ' ';
int deleteStart = -1;
for (int i = 0; i < str.length(); i++) {
lastc = c;
c = str.charAt(i);
sb.append(c);
// "
if (c == '"' && !escape && !slash2 && !slashstar) {
// '"'
if (lastc != '''
|| (i < str.length() - 1 && str.charAt(i + 1) != '''
)) {
inStr = !inStr;
continue;
}
}
// // xxxxx \n
if (c == '\n' && slash2) {
slash2 = false;
sb.delete(deleteStart, sb.length() - 1);
deleteStart = -1;
continue;
}
if (!inStr && c == '/') {
// //
if (lastc == '/' && !slash2 && !slashstar) {
deleteStart = sb.length() - 2;
slash2 = true;
continue;
}
// */
if (lastc == '*' && slashstar) {
slashstar = false;
sb.delete(deleteStart, sb.length());
deleteStart = -1;
continue;
}
}
// /*
if (!inStr && c == '*') {
if (lastc == '/' && !slashstar && !slash2) {
deleteStart = sb.length() - 2;
slashstar = true;
continue;
}
}
if ((inStr || lastc == ''') && c == '\') {
escape = lastc != '\';
} else {
escape = false;
}
}
if (slash2 && deleteStart >= 0) {
sb.delete(deleteStart, sb.length());
}
return sb.toString();
}
【在 l*********8 的大作中提到】 : Well, can you try this one: : char str[] = "\\"; // test \ inside "
|
e****e 发帖数: 418 | 73 My code.
public static String removeComments( String s ) {
for ( int i = 0; i < s.length() - 1; i++ ) {
if ( s.charAt( i ) == '"' ) { // Find "
for ( int j = i + 1; j < s.length(); j++ ) {
if ( s.charAt( j ) == '"' ) { // Find "
i = j + 1;
break;
}
}
}
if ( i < s.length() - 1 && s.charAt( i ) == '/' && s.charAt( i +
1) == '/' ) { // Find //
for ( int j = i + 2; j < s.length(); j++ ) {
if ( s.charAt( j ) == '\n' ) { // Find \n
s = s.substring( 0, i ) + s.substring( j );
i = i + 1;
break;
} else if ( j == s.length() - 1 ) {
i = s.length() - 1;
s = "";
}
}
}
if ( i < s.length() - 1 && s.charAt( i ) == '/' && s.charAt( i +
1 ) == '*' ) { // Find /*
for ( int j = i + 2; j < s.length() - 1; j++ ) {
if ( s.charAt( j ) == '*' && s.charAt( j + 1 ) == '/' )
{ // Find */
if ( j == s.length() - 2 )
s = s.substring( 0, i );
else
s = s.substring( 0, i ) + s.substring( j + 2 );
break;
}
}
}
}
return s;
} |
l*********8 发帖数: 4642 | 74 大致看了一下
你的程序跑过这个测试吗?
input:
char str = "// and \".";// Test for // and " in a string
output:
char str = "// and \".";
【在 e****e 的大作中提到】 : My code. : public static String removeComments( String s ) { : for ( int i = 0; i < s.length() - 1; i++ ) { : if ( s.charAt( i ) == '"' ) { // Find " : for ( int j = i + 1; j < s.length(); j++ ) { : if ( s.charAt( j ) == '"' ) { // Find " : i = j + 1; : break; : } : }
|
z******e 发帖数: 82 | 75 借用eswine的idea:
public static String test1(String str) {
StringBuilder sb = new StringBuilder();
int len = str.length();
boolean escape = false;
for (int i = 0; i < len; i++) {
char c = str.charAt(i);
// everything between ' '
if (c == '\'') {
escape = true;
while (i < len) {
c = str.charAt(i);
sb.append(c);
if (c == '\'' && !escape) {
break;
} else if (c == '\\') {
escape = !escape;
} else {
escape = false;
}
i++;
}
continue;
}
// everything between " "
if (c == '"') {
escape = true;
while (i < len) {
c = str.charAt(i);
sb.append(c);
if (c == '"' && !escape) {
break;
} else if (c == '\\') {
escape = !escape;
} else {
escape = false;
}
i++;
}
continue;
}
// everything between // \n
if (c == '/' && i + 1 < len && str.charAt(i + 1) == '/') {
i += 2;
while (i < len) {
if (str.charAt(i) == '\n') {
sb.append('\n');
break;
}
i++;
}
continue;
}
// everything between /* */
if (c == '/' && i + 1 < len && str.charAt(i + 1) == '*') {
i += 2;
while (i < len) {
if (str.charAt(i) == '*' && i + 1 < len
&& str.charAt(i + 1) == '/') {
i++;
break;
}
i++;
}
continue;
}
sb.append(c);
}
return sb.toString();
}
test:
---------------------------------------
abc//xyz\nwwe*/*sdfsdsdfda*/s"/*fdfsf*/df//sfs"dcvcd
abc\nwwe*s"/*fdfsf*/df//sfs"dcvcd
/*asd
[EMPTY]
/*asd//s"afasd*/
[EMPTY]
/*asdas/*asd*/sd
sd
//asdasd
[EMPTY]
//asdas\n
\n
//as/*fdsf*/das\n
\n
/*as//das*/\n
\n
char c = '"'; /*this is the test for " */
char c = '"';
char c = '"
char c = '"
char c = "'; /*this is the test for " */
char c = "'; /*this is the test for " */
char c = '"'
char c = '"'
char str = "// and \".";// Test for // and " in a string
char str = "// and \".";
char str[] = "\\"; // test \ inside "
char str[] = "\\";
char str[] = '\"'; // test \ inside "
char str[] = '\"';
char str[] = "\\\""; // another test for \ and " in string
char str[] = "\\\"";
/
/
*
*
/*
[EMPTY]
*/
*/
/ /
/ / |
Q*******e 发帖数: 939 | |
d**********x 发帖数: 4083 | 77 我onsite代码写完了,但是基本也就没有别的时间了。
【在 w****x 的大作中提到】 : : 写一个吧, 对这块不是很熟悉
|