题目:
解一:获取两个字符串,设置两个整型的计“值”器,将两个字符串转成对应的字符数组,for循坏分别遍历两个字符数组,将数组中元素对应的ASCII码值赋给计“值”器,这样就通过两个计“值”器进行做差取绝对值(abs方法)再转成字符型就能得出最后的结果。
注:个人感觉这种解法确实是非常快捷、高效。但此解法只适用与一个字符不同,如果是多个不同,如ac与bb的话这两个的ASCII码值也相同,所以可能导致最后结果出错。不管怎么说这种思路还是非常值得学习。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); String str1 = scan.next(); String str2 = scan.next(); int sum1 = 0; int sum2 = 0; char[] chars1 = str1.toCharArray(); char[] chars2 = str2.toCharArray(); for (int i = 0; i < chars1.length; i++) { sum1 += chars1[i]; } for (int i = 0; i < chars2.length; i++) { sum2 += chars2[i]; } System.out.println((char)(Math.abs(sum1 - sum2))); scan.close(); } }解二:该代码利用异或运算的特性:核心原理:异或运算的“同归于尽”的特性。规则:1、相同数值异或结果为0(比如8^8=0、'a'^'a'=0);2、数值与0异或结果为自身(比如0^8=8、0^'a'='a');3、异或满足交换律和结合律(顺序不影响最终结果)。因此,若一个字符出现偶数次,异或后会相互抵消(结果为 0);只有出现奇数次的字符,最终会保留在结果中。该代码中读取输入的两个字符串合并后,所有字符中只有 1 个字符出现奇数次,找出这个唯一出现奇数次的字符并将其输出。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String st = sc.next(); String st2 =st + sc.next(); int temp = 0; for (int i = 0; i < st2.length(); i++) { temp = temp ^ st2.charAt(i); } System.out.println((char)temp); } }解三:获取两个字符串并转成字符数组,分别将字符数组的元素递给hashmap,判断哪个map的长度更短,方便调用viewDiff函数。在viewDiff函数里,进行判断,如果map2里不包含map1里的元素或map2的元素的次数不等于map1该元素的次数,则输出该字符。
import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Map<Character, Integer> map = new HashMap<>(); Map<Character, Integer> map2 = new HashMap<>(); char[] arr = scanner.next().toCharArray(); char[] arr2 = scanner.next().toCharArray(); for (int i = 0; i < arr.length; i++) { char a = arr[i]; map.put(a, map.getOrDefault(a, 0) + 1); } for (int i = 0; i < arr2.length; i++) { char a = arr2[i]; map2.put(a, map2.getOrDefault(a, 0) + 1); } if (map2.size() <= map.size()) { viewDiff(map,map2); } else { viewDiff(map2,map); } } /** * 识别差异字符串 * @param map1 长字符串 * @param map2 短字符串 */ private static void viewDiff(Map<Character,Integer> map1,Map<Character,Integer> map2){ for (Map.Entry<Character, Integer> entry : map1.entrySet()) { char a = entry.getKey(); Integer aValue = entry.getValue(); if (!map2.containsKey(a) || map2.get(a) != aValue) { System.out.println(a); return; } } } }解四:获取两个字符串,如果str比str1长度长,则交换两者,确保str是较短的字符串。双重循坏:遍历较长字符串的每个字符,与较短字符串的每个字符进行对比,若字符相同,将两个数组中对应的位置标记为0(表示重复)。最后遍历较长字符数组,因为重复的元素对应的已经标为0,数组中不为0的则意味着该字符是不同的将其输出。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str =sc.next(); String str1 =sc.next(); if (str.length()>str1.length()) { String temp = str; str = str1; str1 = temp; } char[] c1= str1.toCharArray(); char[] c= str.toCharArray(); for (int i = 0; i < c1.length; i++) { for (int j = 0; j < c.length; j++) { if (c1[i] == c[j]) { c1[i]=0; c [j]=0; } } } for (int i = 0; i < c1.length; i++) { if (c1[i]!=0) { System.out.println(c1[i]); } } sc.close(); } }解五:获取两个字符串,将str1变成较长的字符串。调用xc函数。在xc函数中,将字符串存到对应的map中,对比两个map中相同键的数值差异,将map中“独有的键”或“键对应的数值多于map2的部分”拼接成字符串s,s是s1中去除与s2相同字符后剩余的部分,最后返回s打印输出。
import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String str1=scanner.nextLine(); String str2=scanner.nextLine(); if(str1.length()<str2.length()) { String t =str1; str1=str2; str2=t; } System.out.println(xc(str1, str2)); } public static String xc(String str1,String str2) { String s=""; Map<Character, Integer> map= new HashMap<>(); Map<Character, Integer> map2= new HashMap<>(); for(int i=0;i<str1.length();i++) { if(map.containsKey(str1.charAt(i))) { map.put(str1.charAt(i), map.get(str1.charAt(i))+1); }else { map.put(str1.charAt(i), 1); } } for(int i=0;i<str2.length();i++) { if(map2.containsKey(str2.charAt(i))) { map2.put(str2.charAt(i), map2.get(str2.charAt(i))+1); }else { map2.put(str2.charAt(i), 1); } } Set keySet =map.keySet(); Iterator it = keySet.iterator(); while (it.hasNext()) { Object key=it.next(); Integer valueObject=map.get(key); if(map2.get(key)==null) { while((valueObject--)>0) { s=s+key; } }else { Integer valueObject2=map2.get(key); int a=valueObject-valueObject2; while((a--)>0) { s=s+key; } } } return s; } }解六:获取字符串,将t字符串变成较长字符串,设立一个长度为26的数组,遍历s字符串,将各元素减去‘a’的ASCII码值作为下标存到数组中并加一操作,遍历t字符串,先将对应元素减去‘a’的ASCII码值下标对应的值加一判断是否小于0,是的话,则该下标对应的原字符则为不同的字符打印输出。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.next(); String t = sc.next(); int[] count = new int[26]; if (s.length() > t.length()) { String temp = s; s = t; t = temp; } for (int i = 0; i < s.length(); i++) { count[s.charAt(i) - 'a']++; } for (int j = 0; j < t.length(); j++) { if (--count[t.charAt(j) - 'a'] < 0) { System.out.println(t.charAt(j)); break; } } } }解七(自己的解法):获取字符串,将字符串内容存到各自的map中,创建一个arraylist动态数组,增强for循坏遍历hashmap1,如果map2中有map1对应的字符且次数相同,则将该字符存到动态数组中,for循坏删除map1和map2中该字符的“键”。最后判断哪个map长度为1,将不同的字符打印输出。
import java.util.*; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); Scanner scanner = new Scanner(System.in);//从键盘输入两个字符串 String x1 = scanner.nextLine(); String x2 = scanner.nextLine(); HashMap<Character,Integer> hashMap1 = new HashMap<>();//创立两个hashmap存放 HashMap<Character,Integer> hashMap2 = new HashMap<>(); //具体存入 for (int i = 0;i<x1.length();i++){ char a = x1.charAt(i); if (hashMap1.containsKey(a)){ hashMap1.put(a,hashMap1.get(a)+1); }else { hashMap1.put(a,1); } } for (int j = 0;j<x2.length();j++){ char b = x2.charAt(j); if (hashMap2.containsKey(b)){ hashMap2.put(b,hashMap2.get(b)+1); }else { hashMap2.put(b,1); } } Set<Map.Entry<Character,Integer>> entrySet = hashMap1.entrySet(); ArrayList<Character> arrayList = new ArrayList<>();//创建一个arraylist动态数组,用于存放相同的字符 for (Map.Entry<Character,Integer> entry:entrySet){//增强for循坏遍历hashmap1 if (hashMap2.containsKey(entry.getKey()) && hashMap2.get(entry.getKey()) == entry.getValue()){//如果字符串2有1中的字符且次数相同 arrayList.add(entry.getKey());//则将对应的字符存到arraylist中 } } for (Character x:arrayList){//增强for循坏,删除hashmap1、2中相同的字符 hashMap1.remove(x); hashMap2.remove(x); } //判断哪个里有多余的字符打印输出 if (hashMap1.size()==1){ for (Character key:hashMap1.keySet()){ System.out.println(key); } } else if (hashMap2.size()==1){ for (Character key:hashMap2.keySet()){ System.out.println(key); } } scan.close(); } }