一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 1919|回复: 9
收起左侧

FB的那道remove comment解答

[复制链接] |试试Instant~ |关注本帖
zengm321 发表于 2015-3-5 14:30:06 | 显示全部楼层 |阅读模式

2015(1-3月) 码农类 硕士 全职@Facebook - 内推 - 技术电面 |Other

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
看大家的FB面经,感觉remove comment这道题很困扰大家
好吧,我来贴个链接,攒个rp。 大家互相帮助,信息共享,祝大家早日拿到满意offer。
虽然不完全一样,但是基本解决问题,而且还同时解决了"//"。单行注释的问题。
http://geeksquiz.com/remove-comments-given-cc-program/.鏈枃鍘熷垱鑷1point3acres璁哄潧


string removeComments(string prgm)
{
    int n = prgm.length();
    string res;

    // Flags to indicate that single line and multpile line comments
    // have started or not.
    bool s_cmt = false;
    bool m_cmt = false;
.1point3acres缃
.鐣欏璁哄潧-涓浜-涓夊垎鍦
    // Traverse the given program
    for (int i=0; i<n; i++)
    {
        // If single line comment flag is on, then check for end of it
        if (s_cmt == true && prgm == '\n')
            s_cmt = false; 鏉ユ簮涓浜.涓夊垎鍦拌鍧.

        // If multiple line comment is on, then check for end of it
        else if  (m_cmt == true && prgm == '*' && prgm[i+1] == '/'). visit 1point3acres.com for more.
            m_cmt = false,  i++;

        // If this character is in a comment, ignore it
        else if (s_cmt || m_cmt)
            continue;. from: 1point3acres.com/bbs

        // Check for beginning of comments and set the approproate flags
        else if (prgm == '/' && prgm[i+1] == '/')
            s_cmt = true, i++;
        else if (prgm == '/' && prgm[i+1] == '*')
            m_cmt = true,  i++; 鏉ユ簮涓浜.涓夊垎鍦拌鍧.

        // If current character is a non-comment character, append it to res
        else  res += prgm;
    } 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
    return res;
}. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴

评分

2

查看全部评分

sunnyiez 发表于 2015-3-11 05:25:52 | 显示全部楼层
This problem should use automaton to handle. My automaton has four states. The initial state is 0, indicting non-commented part.

#include <iostream>
using namespace std; .鐣欏璁哄潧-涓浜-涓夊垎鍦
.鏈枃鍘熷垱鑷1point3acres璁哄潧
void remove_comment (string str)
{
        int status = 0 ;
        for (int i = 0; i < str.size(); ++ i)
        {
                char ch = str ;
.1point3acres缃                switch (status) . Waral 鍗氬鏈夋洿澶氭枃绔,
                {
                case 0 : if (ch == '/') status = 1; else std::cout<<ch ; break;
                case 1 : if (ch == '*') status = 2; else { status = 0; std::cout<<'/'<<ch ;} break; -google 1point3acres
                case 2 : if (ch == '*') status = 3; else ; break;
                case 3 : if (ch == '/') status = 0; else status = 2 ; break;  . Waral 鍗氬鏈夋洿澶氭枃绔,
                }
        }. 鍥磋鎴戜滑@1point 3 acres
}

. From 1point 3acres bbsint main()
{
        // test ;. Waral 鍗氬鏈夋洿澶氭枃绔,
        string str1 = "/* hello world*/Hello world" ;
        remove_comment (str1) ; std::cout<<std::endl;
        string str2 = "out/*** * /*no output */put"  ;
        remove_comment (str2) ; std::cout<<std::endl;
        string str3 = "/**/out/*** * \n /* \n no output */put/*///* * /* ///* */"  ;  
        remove_comment (str3) ; std::cout<<std::endl;.1point3acres缃
}

. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
补充内容 (2015-3-11 05:30):
char ch = str [   i ]
回复 支持 1 反对 0

使用道具 举报

houqingniao 发表于 2015-3-5 20:51:33 | 显示全部楼层
多谢楼主~~
但是里面好像是有bug的吧
prgm == '*' && prgm[i+1] == '/') 这个i+1会不会抛出index out of。。。
回复 支持 1 反对 0

使用道具 举报

sunfish 发表于 2015-3-5 14:56:17 | 显示全部楼层
非常感谢楼主,楼主的精神真值得我么你学习。
回复 支持 反对

使用道具 举报

rengokantai 发表于 2015-3-5 21:46:48 | 显示全部楼层
论坛的系统得改一下了,那个数组i标志总是被当做italic标签被吃掉,不利于代码交流
回复 支持 反对

使用道具 举报

sunnyiez 发表于 2015-3-11 05:34:34 | 显示全部楼层
Below is the automaton I designed. FYI.

                               
登录/注册后可看大图


回复 支持 反对

使用道具 举报

wendy33 发表于 2015-3-11 23:12:04 | 显示全部楼层
sunnyiez 发表于 2015-3-11 05:34
Below is the automaton I designed. FYI.

点赞!! 字数字数
回复 支持 反对

使用道具 举报

thewave 发表于 2015-10-21 07:40:37 | 显示全部楼层
sunnyiez 发表于 2015-3-11 05:34
Below is the automaton I designed. FYI.

In state 3, if receive another '*', state should stay at 3.

Good point to use DFA.
I think DFA is always worth consideration if input is related to stream and pattern, such as this question, and strstr.
.1point3acres缃
string removeComments(string input){
        //design FSM. 鍥磋鎴戜滑@1point 3 acres
        int state = 0;.鏈枃鍘熷垱鑷1point3acres璁哄潧
        string res = "";
        for(int i=0;i<input.length();i++){. visit 1point3acres.com for more.
            char ch = input;
            switch(state){
                case 0:. 鍥磋鎴戜滑@1point 3 acres
                    if(ch=='/')state = 1;
                    else res += ch;
                    break;.鐣欏璁哄潧-涓浜-涓夊垎鍦
                case 1:. 1point 3acres 璁哄潧
                    if(ch=='/')state = 20;
                    else if(ch=='*')state = 30;.1point3acres缃
                    else {
                        res += '/' + ch;
                        state = 0;. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
                    }. from: 1point3acres.com/bbs
                    break;
                case 20: //single line comment
                    if(ch=='\n')state = 0;
                    break;
                case 30:   //multiple line comments
                    if(ch=='*')state = 31;
                    break;
                case 31:
                    if(ch=='/')state = 0;
                    else if(ch=='*')state = 31;
                    else state = 30;
                    break;
            }
        }
    }. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷



补充内容 (2015-10-21 07:44):
不好意思,忘记return res;
回复 支持 反对

使用道具 举报

gamespeed 发表于 2015-10-27 04:04:59 | 显示全部楼层
有个边界条件,即每次访问prgm[i+1]时,需要先检查i+1<n
回复 支持 反对

使用道具 举报

zzhmxf 发表于 2016-10-23 08:07:14 | 显示全部楼层
想问一下各位,如果代码里面有类似这么一句:
String s = "asf\"daf/*";
那如何处理quote 里面的 /*  以及string里面的quote?
谢谢啦。
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-8 19:53

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表