📣 Back to School开学季 - VIP通行证5折优惠!蓝莓、Offer多多同步优惠
查看: 3972| 回复: 10
跳转到指定楼层
上一主题 下一主题
收起左侧

Google : 找出第一个只出现一次的字符

全局:

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

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b

上一篇:Anonymous : 求数组中元素为另外两个元素和的最大元素
下一篇:Microsoft : 找出相交两链表的交节点
🔗
ljfljf2006 2011-5-16 18:31:59 | 只看该作者
全局:
先写个最直接的。

开两个int数组。扫描字符串,一个记录字符出现的次数,一个记录字符第一次出现的位置。
扫描字符串后,把两个int数组扫描一遍,就可以知道答案了。
效率O(256+N)。

评分

参与人数 1大米 +100 萝卜 +5 收起 理由
wwwyhx + 100 + 5

查看全部评分

回复

使用道具 举报

🔗
darksteel 2011-5-17 04:41:49 | 只看该作者
全局:
回复 2# ljfljf2006
好像也想不出更好的了。。
回复

使用道具 举报

🔗
darksteel 2011-5-17 09:03:47 | 只看该作者
全局:
回复 4# holyzz
大体上是这样没错,但带着常数考虑的话,你说的这个方法需要扫描两遍,是2n,2楼的方法是n+256,在n比较大的时候还是更优一些。关键在于第二遍再扫描原数组的话可能有许多重复操作是无效的。不过如果字符是unicode编码的话,就不止256种情况了。不知还有没有更好的办法
回复

使用道具 举报

🔗
 楼主| wwwyhx 2011-5-17 12:58:00 | 只看该作者
全局:
回复  holyzz
大体上是这样没错,但带着常数考虑的话,你说的这个方法需要扫描两遍,是2n,2楼的方法是n+256,在n比较大的时候还是更优一些。关键在于第二遍再扫描原数组的话可能有许多重复操作是无效的。不过如果字符是unicode编码的话,就不止256种情况了。不知还有没有更好的办法
darksteel 发表于 2011-5-17 09:03


不是的,holyzz的解法时间复杂度是O(n),空间复杂度是O(1),因为256是常量,O(256n) == O(n)
O(256) = O(1),
回复

使用道具 举报

🔗
darksteel 2011-5-17 13:51:48 | 只看该作者
全局:
回复 6# wwwyhx
空间的256可以算是O(1)。时间上是O(n)肯定没错,不过这个过程比较单一的用渐进复杂度就不合适了,我只是想说明上面的解法是2n,2楼的解法是n+256,两者稍有点区别
回复

使用道具 举报

🔗
 楼主| wwwyhx 2011-5-17 16:30:38 | 只看该作者
全局:
回复  holyzz
大体上是这样没错,但带着常数考虑的话,你说的这个方法需要扫描两遍,是2n,2楼的方法是n+256,在n比较大的时候还是更优一些。关键在于第二遍再扫描原数组的话可能有许多重复操作是无效的。不过如果字符是unicode编码的话,就不止256种情况了。不知还有没有更好的办法
darksteel 发表于 2011-5-17 09:03



    的确更简洁一些,解释一下,两个数组A[256]和B[256],A是letter->time,B是order->letter, 相当于两个映射表。记录order就是为了快速的定位到下一个只出现一个的元素,good!!
回复

使用道具 举报

🔗
 楼主| wwwyhx 2011-5-17 22:30:12 | 只看该作者
全局:
char GetFirstOnce(const char* szString)
{
        assert(NULL != szString);

        int ChrToFreq[256];
        memset(ChrToFreq, 0, sizeof(ChrToFreq));
        char OrderToChr[256];
        memset(OrderToChr, 0, sizeof(OrderToChr));

        int nIter = 0;
        int nRet = 0;
        while (0 != *szString)
        {
                ChrToFreq[*szString]++;
                if (1 == ChrToFreq[*szString])
                        OrderToChr[nIter++] = *szString;
               
                while(nRet < nIter && ChrToFreq[OrderToChr[nRet]] > 1) nRet++;

                szString++;
        }

        if (nRet == nIter) return 0;

        return OrderToChr[nRet];
}
回复

使用道具 举报

🔗
epic 2011-5-20 10:47:25 | 只看该作者
全局:
从后往前扫描,如果该字符无重复hash值,不就只要扫描一遍了么?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

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