找出字符串中第一个只出现过一次的字符和位置

题目:找出字符串中第一个只出现过一次的字符和位置

比如:abcebad 只出现过一次的第一个字符应该是c,第3个。

@左耳朵耗子 大哥说的算法如下:

      

        int[] pos = new int[256];
        Arrays.fill(pos, -1);

        for (int i = 0, len = s.length(); i < len; ++i) {
            char c = s.charAt(i);
            if (pos[c] == -1) {
                pos[c] = i;
            } else {// 不等于-1,说明出现过一次了
                pos[c] = -1;
            }
        }

        char oneChar = ' ';
        int oneCharPos = Integer.MAX_VALUE;

        for (int i = 0; i < 256; ++i) {
            if (pos[i] > -1 && pos[i] < oneCharPos) {
                oneChar = (char) i;// s.charAt(pos[i]);
                oneCharPos = pos[i];
            }
        }

        System.out.println(oneChar + ":" + (oneCharPos + 1));

第一次想到的就是需要记录位置和字符,其实当时的想法和这个还是有出入的。最后@左耳朵耗子 大哥把我拉回这种算法,并仔细讲解了下。


当时我第二个想法是记录每个字符出现的次数,思绪当时也有点堵,@左耳朵耗子 大哥对我这次提出的算法理解和我是有点偏差的,其实不是n^2的算法,而是2n的复杂度,

回来后理清了下思路,大致代码如下:(这种算法不知道是否完全正确)

        int len = s.length();
        int[] ascii = new int[256];

        for (int i = 0; i < len; ++i) {
            char c = s.charAt(i);
            ascii[c]++;
        }

        char oneChar = ' ';
        int oneCharPos = -1;

        for (int i = 0; i < len; ++i) {
            char c = s.charAt(i);
            if (ascii[c] == 1) {
                oneChar = s.charAt(i);
                oneCharPos = i;
                break;
            }
        }

        System.out.println(oneChar + ":" + (oneCharPos + 1));

当时其实还有个问题是字符真的只有256吗?针对这种情况,现在想应该可以先扫描出最大的ascii值,然后在new 一个这么大的一个标记数组。

一紧张,思路总是有点堵,而且自己的理解能力其实也有待提高。还是自己不够强,所以自信不够啊。

----------------------------------------------------------------分割线--------------------------------------------------------------

一直很敬佩@左耳朵耗子 大哥,经常关注他的微博和博客,今天很高兴能见到他本人并聊了那么多。@左耳朵耗子 大哥一些话其实还是比较打击到我的,不过回想下确实这两年下来自己懒惰了很多,荒废了很多时间。@左耳朵耗子 大哥对我的一些建议很好,很感谢这次机会,很感谢@左耳朵耗子 大哥。希望今后自己能发愤图强吧,不经要看还要多写多理解。ps:猜想今天给@左耳朵耗子 大哥留下的影响并不是很好。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值