P1:计算一个整数在二进制表示下的补数
public class NumberComplement { public static int findComplement(int num) { if (num<0) return minnum(num); else if (num>0) return posnum(num); else return 1; }
负数取补直接用了数学方法-n-1
//数学方法 private static int minnum(int n){ return -n-1; }
正数方面用了ArrayList拆分再组合的方法(同数学计算)
sum += Math.pow(2,ron++)*Math.abs(i-1);
private static int posnum(int n){ ArrayList<Integer> list = new ArrayList<>(); //list中最前面的是最低位 for (;n!=0;){ int rest; rest = n % 2; if(rest==1) list.add(1); else list.add(0); n /= 2; } int ron = 0,sum = 0; for (Integer i:list){ sum += Math.pow(2,ron++)*Math.abs(i-1); } return sum; } }
P3 P4 P5:在一个字符数组中,除了某一个字符只出现一次外,其他字符都出现过两次,请找出只出现一次的字符。
**这题有个知识点遗漏-->
在判断char[] 为空时
char[] p = {}; if ((characters.equals(p))||(characters.length==0)||(characters==null)) return '\0';
这样写可能会报错,因为当char[] chs== null时 chs.length会抛出异常java.lang.NullPointerException: null
改正:
char[] p = {}; if ((characters==null)||(characters.equals(p))) return '\0';
将characters==null?提前,直接删除character.length
(只要出现character.length就会抛异常)
---------------------------------------------
java.lang.NullPointerException: null
调用 null 对象的实例方法。
访问或修改 null 对象的字段。
将 null 作为一个数组,获得其长度。
将 null 作为一个数组,访问或修改其时间片。
将 null 作为 Throwable 值抛出
---------------------------------------------
P3:嵌套循环
public class SingleCharacterI { public static char singleNumber(char[] characters) { char[] p = {}; if ((characters==null)||(characters.equals(p))) return '\0'; int len = characters.length; for (int i=0;i < len;i ++){ boolean bool = true; for (int j=0; j < len;j ++){ if((characters[i]==characters[j])&&(j != i)){ bool = false; break; } } if(bool) return characters[i]; bool = true; } return '\0'; } }
P4:哈希表(结果可能为多个char的做法)
map.put(Character.toString(ch),num==null?1:num+1);
——————————————————————————————————————————————————————————
public class SingleCharacterII { public static char singleNumber(char[] characters) { char[] p = {}; if ((characters==null)||(characters.equals(p))) return '\0'; Map<String,Integer> map = new HashMap<String, Integer>(); // 将char数组 转换为HashMap for (char ch : characters){ Integer num = map.get(Character.toString(ch)); map.put(Character.toString(ch),num==null?1:num+1); } // 得到键值对 for (String key:map.keySet()){ if (map.get(key)==1){ return key.toCharArray()[0]; } } return '\0'; } }
P5:异或法
public class SingleCharacterIII { public static char singleNumber(char[] characters) { char[] p = {}; if ((characters==null)||(characters.equals(p))) return '\0'; char ans = 0; for (int i=0;i < characters.length;i ++) ans ^= characters[i]; return ans; } }