最简单的方案,放到LinkedHashSet()再输出出来,绝对的有序且去重,时间复杂度不高,hashset底层用的HashMap(),增加元素时间复杂度O(1)——O(n)
代码:ps:为了方便测试我把参数写到了方法里面
@Test
public void ceshi(){
String a = "AAABBDFDAC";
Set set = new LinkedHashSet();
char[] chars = a.toCharArray();
for(int i = 0 ; i < a.length() ; i ++){
set.add(chars[i]);
}
System.out.println(set.toString());;
}
时间复杂度最好的方案,而且不使用别人的东西
假定字符串是从键盘输入的,就逃不出26个字母和各种标点符号范畴,可以从编码格式角度出发,首先打印出200以内所有的字符,数字转字符看一下有哪些
代码:
@Test
public void ceshi2(){
String a = "AAABBDFDAC";
int i = 0;
while(i<100){
System.out.print(i+":");
System.out.print((char)i);
System.out.print(" ");
i++;
}
}
大概从33开始有东西是个!
截止到126左右,后面就没有键盘上正常的字符了。
搞个150长的int空数组置为0;
遍历字符,根据字符ascii码10进制数代表数组下标,拿到一个码就在数组该下标位置里的值执行加一操作,如果加完1以后是1就放到StringBuffer里面。最后输出字符串。(事实上还带了统计重复出现次数的功能,但是不支持中文等,只支持普通字符)
150的数组可能有点浪费内存
@Test
public void ceshi2(){
String a = "AAABBccDFDACggghh";
int [] table = new int[150];
StringBuffer sb = new StringBuffer();
char[] chars = a.toCharArray();
for (int i = 0 ; i < chars.length ;i++){
int flag = (int)chars[i]; //找到
table[flag] = ++table[flag];
if(table[flag]==1){
sb.append((char)flag);
}
}
System.out.println(sb.toString());
}