news 2026/4/12 13:31:55

Question:找到给定字符串中的不同字符(java)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Question:找到给定字符串中的不同字符(java)

题目:

解一:获取两个字符串,设置两个整型的计“值”器,将两个字符串转成对应的字符数组,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=80^'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(); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 6:46:28

CANN训练营 学习(day11)昇腾TBEDSL算子开发艺术指南

训练营简介 报名链接​​https://www.hiascend.com/developer/activities/cann20252#cann-camp-2502-intro 目录 昇腾TBE DSL深度烹饪指南&#xff1a;从算子规格到“米其林”级性能的艺术 第一章&#xff1a;备料与选材——算子规格的深度解析与艺术构思 第二章&#xff…

作者头像 李华
网站建设 2026/4/10 23:09:47

P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III

目录题目-P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III问题分析算法步骤代码实现题目-P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III 问题分析 查询区间众数出现的次数, 尝试对区间进行分块 假设已经知道了区间内众数出现的次数sss, 那么只需要判断散…

作者头像 李华
网站建设 2026/4/12 13:25:26

精通Java LaTeX渲染:JLaTeXMath实战应用全解析

精通Java LaTeX渲染&#xff1a;JLaTeXMath实战应用全解析 【免费下载链接】jlatexmath A Java API to render LaTeX 项目地址: https://gitcode.com/gh_mirrors/jl/jlatexmath 在Java开发中&#xff0c;如何高效渲染复杂的数学公式一直是个技术难题。JLaTeXMath作为专业…

作者头像 李华
网站建设 2026/4/11 23:44:11

C++ 对象池 (objPool) 模块设计与实现分析

个人专著《C++元编程与通用设计模式实现》由清华大学出版社出版。该书内容源于工业级项目实践,出版后市场反馈积极(已加印)。其专业价值获得了图书馆系统的广泛认可:不仅被中国国家图书馆作为流通与保存本收藏,还被近半数省级公共图书馆及清华大学、浙江大学等超过35所高校…

作者头像 李华
网站建设 2026/4/11 21:01:04

如何高效定制B站API认证凭证:全新Cookies配置指南

掌握B站API调用的核心技巧&#xff01;本文将为你详细解析bilibili-api项目最新推出的自定义Credential Cookies功能&#xff0c;帮助你快速实现灵活的身份认证配置。 【免费下载链接】bilibili-api 哔哩哔哩常用API调用。支持视频、番剧、用户、频道、音频等功能。原仓库地址&…

作者头像 李华