笔试题二【解答】

这个应该算是百度笔试的经典题了,我记得去年打酱油笔试百度实习生的时候就考了这个题,现在再来看看!

关于这个题,我觉得应该有几个思考的方法,大家看看觉得哪种好啦!或者有更好的记得分享啦!

方法一:【转自】http://www.cnblogs.com/shaosks/archive/2012/05/07/2487602.html

     该作者认为判断词A和词B是否是兄弟单词就是看组成A和B两个单词的所有字母是不是都一样,只是顺序不同。

     所以,思路大概是,将单词A与单词B按照AscII值来进行排序,如果一样则为兄弟单词。

    首先是计算词A的AscII值,然后遍历给定的词典,对于词典中的每一个值计算其AscII值,与上一步求出的AscII值进行比较,如果相等,这个单词就是单词A的兄弟词典。

   【感觉可以改进的地方是先判断词典中词的长度是否等于词A的长度,如果相等再进行上面的比较,如果不相等则直接跳过,这样能减小复杂度】

    具体实现如下:

   

/// <summary>

        /// 把一个字符串单词转化为一个字符列表

        /// </summary>

        /// <param name="vocabulary"></param>

        /// <returns></returns>

        private static IList<char> GetCharListByVoca(string vocabulary)

        {

            return (from m in vocabulary.ToCharArray() orderby m ascending select m).ToList();

        }

       private static bool IsBrotherVoca(string vocabulary, IList<char> keyVocaCharList) //keyVocaCharList为输入词A的AscII值,vocabulary为词典中的词

        {

            IList<char> vocaCharList = GetCharListByVoca(vocabulary);        

            int i = 0;

            bool flag = true;

            foreach (char c in vocaCharList)

            {

                if (c != keyVocaCharList[i])

                {

                    flag = false;

                    break;

                }

                i++;

            }

            return flag;

        }


方法二:

     找到词A的所有兄弟单词,然后将这个list里的单词逐个的在字典中搜索。

     根据“兄弟单词”的定义,词A的兄弟单词是将词A的字母进行交换的结果【不止交换一次】

    首先得到【交换一次的】A的兄弟单词,然后将这些兄弟单词分别进行递归,直到所有情况都出现为止,但是这种情况对于长度比较长的词A来说是很不可取的!


     

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值