剑指offer-[字符流中第一个不重复的字符]-JavaScript实现

这道题我的答案没有在牛客网上通过。但是我自己跑测试用例的结果与牛客网上显示的结果不一致。我觉得我的测试结果是正确的。翻了一下牛客网的讨论也没有看到JS的答案T.T 下面写一下我的思路和代码,如果有大神能跟我讨论一下就更好了~

题目描述

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。

牛客网的默认模板

//Init module if you need
function Init()
{
    // write code here
}
//Insert one char from stringstream
function Insert(ch)
{
    // write code here
}
//return the first appearence once char in current stringstream
function FirstAppearingOnce()
{
    // write code here
}

牛客网的默认摸板是这个样子的,我看了一下大概意思是Insert函数来实现从当前字符流中读取当前字符。FirstAppearingOnce函数用来返回题目要求的第一个只出现一次的字符。但是这个Init函数是用来干嘛的我就不懂了。。。有大神能告诉我一下答案么(苦笑)

思路分析

首先是Insert函数,我们需要将字符流中的当前字符存下来。那很简单,字符串拼串和数组压入都可以,这里我用了一个数组str来压入每一个字符。
其次考虑FirstAppearingOnce函数,每一次执行这个函数时,我都创建了一个对象obj,利用对象键值对(属性:属性值)来记录每一个字符和出现次数。最后遍历对象的属性,返回出现次数为1的那一个属性即可。

具体JS代码实现

//Init module if you need
var str = new Array();
function Init()
{
    // write code here
}
//Insert one char from stringstream
function Insert(ch)
{
    // write code here
    str.push(ch);
}
//return the first appearence once char in current stringstream
function FirstAppearingOnce()
{
    // write code here
    var length = str.length;
    var obj = {};
    for(let i = 0; i<length; i++)
    {
        if(!obj.hasOwnProperty([str[i]]))
        {
            obj[str[i]]=1 
        }
        else
        {
            obj[str[i]]++
        }
    }
    for(var key in obj)
    {
        if(obj[key]==1)
        {
            return key
        }
        
    }
    return "#"
}

遗留问题

让我很费解的时候,这个代码在牛客网上调试时,报错信息如下:
在这里插入图片描述
我就去我的编译器上想找找原因。我用下面的代码模拟了字符流的输入(难道这一步有问题?)

var s = "helloworld"
for(let i = 0;i<s.length;i++)
{
	Insert(s[i])
	console.log(FirstAppearingOnce())
}

我的输出结果如下:
在这里插入图片描述
迷惑- -,所以现在的我也不清楚到底哪一部错了。。如果有大神能看出来,希望给小妹讲解一下。感激!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值