import java.util.Optional;
/**
* Author:SunLala
* Date: 2022/3/26
* 功能描述:(给定一个字符类型数组chas[],判断chas中是否所有的字符都只出现过一次)
* 要求:实现复杂度为O(N)的方法
* 举例:chas=['a','b','c'],返回true;chas=['1','2','1'],返回false;
*/
public class Test8 {
/**
* 自己写的
* @param chas
* @return
*/
public static boolean checkChar(char[] chas){
/**
* 知识点:这里我一开始定义的数组长度为128,但是参考书上说的是256,很困惑
* 很早了个答案,可以解决我的困惑
* ASCII码共有256个字符
* ASCII码占用一个字节,可以有0~255共256个取值。前128个为常用的字符如运算符,字母 ,数字等 键盘上可以显示的后 128个为 特殊字符是键盘上找不到的字符。
*/
int [] charMaps = new int[256];
if(!Optional.ofNullable(chas).isPresent()){
return true;
}
for (int i = 0; i < chas.length; i++) {
int j = chas[i] - 0;
charMaps[j] += 1;
if(charMaps[j] > 1){
return false;
}
}
return true;
}
public static boolean isUnique(char[] chas){
if(chas == null){
return true;
}
boolean[] map = new boolean[256]; //默认全是false
for (int i = 0; i< chas.length; i++){
if(map[chas[i]]){ //判断已经是true,说明这是第二次出现,则直接返回false
return false;
}
map[chas[i]] = true; //第一次出现把对应位置改成true
}
return true;
}
public static void main(String[] args) {
// System.out.println('A'-0);//转正int型
// System.out.println('A');//输出会是字符串
System.out.println(checkChar("ASAADAD".toCharArray()));
System.out.println(checkChar("ABC".toCharArray()));
System.out.println(checkChar("#21.,..++".toCharArray()));
System.out.println(checkChar("21` s*&^".toCharArray()));
System.out.println(isUnique("#21.,..++".toCharArray()));
System.out.println(isUnique("21` s*&^".toCharArray()));
}
}
总结:
1. ASSIC的理解
ASCII码共有256个字符 ASCII码占用一个字节,可以有0~255共256个取值。前128个为常用的字符如运算符,字母 ,数字等 键盘上可以显示的后 128个为 特殊字符是键盘上找不到的字符。
2.对ASSIC的使用
int [] charMaps = new int[256];
int j = chas[i] - 0; 转成int