您的位置:首页 > 其它

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

2013-07-31 20:22 288 查看
题目:找出字符串中第一个只出现过一次的字符和位置

比如: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:猜想今天给@左耳朵耗子 大哥留下的影响并不是很好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐