推荐:数据科学课程和书籍清单以及培训讲座


一亩三分地论坛

 找回密码
 获取更多干活,快来注册

一亩三分地官方iOS手机应用下载
查看: 3310|回复: 9
收起左侧

FB的那道remove comment解答

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

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

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

您需要 登录 才可以下载或查看,没有帐号?获取更多干活,快来注册

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


string removeComments(string prgm)
{. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
    int n = prgm.length();-google 1point3acres
    string res;. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴

    // Flags to indicate that single line and multpile line comments. more info on 1point3acres.com
    // have started or not.. From 1point 3acres bbs
    bool s_cmt = false;
    bool m_cmt = false;
.鐣欏璁哄潧-涓浜-涓夊垎鍦

    // 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. Waral 鍗氬鏈夋洿澶氭枃绔,
        else if  (m_cmt == true && prgm == '*' && prgm[i+1] == '/')
            m_cmt = false,  i++;

        // If this character is in a comment, ignore it
        else if (s_cmt || m_cmt)
            continue;

        // 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++;. from: 1point3acres.com/bbs

        // 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. . visit 1point3acres.com for more.
. From 1point 3acres bbs
#include <iostream>
using namespace std;
. From 1point 3acres bbs
void remove_comment (string str)
{
        int status = 0 ; .1point3acres缃
        for (int i = 0; i < str.size(); ++ i) .鏈枃鍘熷垱鑷1point3acres璁哄潧
        {. From 1point 3acres bbs
                char ch = str ;
                switch (status)
                {
                case 0 : if (ch == '/') status = 1; else std::cout<<ch ; break;
                case 1 : if (ch == '*') status = 2; else { status = 0; std::cout<<'/'<<ch ;} break;
                case 2 : if (ch == '*') status = 3; else ; break;
                case 3 : if (ch == '/') status = 0; else status = 2 ; break;  
                }
        }
}-google 1point3acres

int main()
{
        // test ;
        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;
}


补充内容 (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.

                               
登录/注册后可看大图

. 1point3acres.com/bbs
回复 支持 反对

使用道具 举报

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.com/bbs
string removeComments(string input){
        //design FSM
        int state = 0;. from: 1point3acres.com/bbs
        string res = "";
        for(int i=0;i<input.length();i++){
            char ch = input;
            switch(state){
                case 0:
                    if(ch=='/')state = 1;
                    else res += ch;
                    break;
                case 1:
                    if(ch=='/')state = 20;
                    else if(ch=='*')state = 30;
                    else {. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
                        res += '/' + ch;
                        state = 0;
                    }
                    break;
                case 20: //single line comment
                    if(ch=='\n')state = 0;. From 1point 3acres bbs
                    break;
                case 30:   //multiple line comments
                    if(ch=='*')state = 31;.鏈枃鍘熷垱鑷1point3acres璁哄潧
                    break;
                case 31:
                    if(ch=='/')state = 0;
                    else if(ch=='*')state = 31;-google 1point3acres
                    else state = 30;
                    break;
            }
        }. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
    }



补充内容 (2015-10-21 07:44):. from: 1point3acres.com/bbs
不好意思,忘记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?
谢谢啦。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

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

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2017-8-17 16:08

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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