HJ8 合并表记录
描述
数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。
提示:
0 <= index <= 11111111
1 <= value <= 100000
输入描述:
先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开输出描述:
输出合并后的键值对(多行)
示例:
输入:4 0 1 0 2 1 2 3 4 输出:0 3 1 2 3 4
输入:3 0 1 0 2 8 9 输出:0 3 8 9
分析:
1.使用TreeMap集合来存储键值对。
2.TreeMap集合可以key去重和key自然排序。
代码:
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num=sc.nextInt();
TreeMap<Integer,Integer> map=new TreeMap<>();
int index,value;
for (int i = 0; i < num; i++) {
index=sc.nextInt();
value=sc.nextInt();
if(index<0&& i>11111111 ||value<1&&value>100000){
System.out.println("输入非法!");
return;
}
if(map.containsKey(index)){
map.replace(index,map.get(index)+value);
}else {
map.put(index,value);
}
}
Set<Map.Entry<Integer,Integer>> entrySet = map.entrySet();
for (Map.Entry<Integer, Integer> entry : entrySet) {
Integer key1 = entry.getKey();
Integer value1 = entry.getValue();
System.out.println(key1 + " " + value1);
}
}
}
大佬代码:
getOrDefault:通过Key获取对应的value,如果key不存在则返回默认值。
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception{
Scanner sc = new Scanner(System.in);
TreeMap<Integer, Integer> map = new TreeMap<>(); // 输出结果要求有序!
while(sc.hasNextInt()){
int n = sc.nextInt();
for(int i = 0; i < n; ++i){
int a = sc.nextInt();
int b = sc.nextInt();
map.put(a,map.getOrDefault(a,0) + b);
}
}
for (Integer i : map.keySet()) {
System.out.println(i + " " + map.get(i));
}
}
}
HJ9 提取不重复的整数
描述
输入一个 int 型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
保证输入的整数最后一位不是 0 。
数据范围: 1≤𝑛≤108 1≤n≤108
输入描述:
输入一个int型整数
输出描述:
按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
示例:
输入:9876673 输出:37689
分析:
1.使用StringBuilder类的reverse方法反转字符串。
2.使用LinkedHashSet集合去重。
代码:
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb=new StringBuilder(sc.nextLine()).reverse();
String str=sb.toString();
if(str.charAt(0)=='0'){
System.out.println("输入非法!");
return;
}
LinkedHashSet<Character> set=new LinkedHashSet<>();
for (int i = 0; i < str.length(); i++) {
set.add(str.charAt(i));
}
for (char ch:set) {
System.out.print(ch);
}
}
}
大佬代码:
使用HashSet集合来去重。再从右往左依次算出每个位数的数值。
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
// 使用HashSet来判断是否是不重复的
HashSet<Integer> hs = new HashSet<>();
int target = sc.nextInt();// 获取代求解的值
while(target != 0){ // 求解每位上面的整数
int temp = target % 10;
if(hs.add(temp)) // 如果能加入,就是说明没有重复
System.out.print(temp);
target /= 10;// 除10能去掉最右边的数字
}
System.out.println();
}
}
}
indexOf() :返回指定字符ch在此字符串中第一次出现处的索引值;如果未出现该字符,则返回-1。
//逆序排列
StringBuilder stringBuilder = new StringBuilder(scanner.nextLine()).reverse();
String str = stringBuilder.toString();
//结果集
StringBuilder result = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
if (str.indexOf(str.charAt(i)) == i) {
result.append(str.charAt(i));
}
}
System.out.println(result.toString());
}
直接利用字符串包含。
import java.util.*;
public class Main{
public static void main(String agrs[]) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
String result = "";
for (int i = line.length(); i > 0; i--) {
if (!result.contains(line.substring(i-1,i))) {
result += line.substring(i-1,i);
}
}
System.out.println(result);
}
}