某客网编程题三道(Java)——字符串、集合、数组
第一题:
题目描述
找出字符串中第一个只出现一次的字符
输入描述:
输入几个非空字符串
输出描述:
输出第一个只出现一次的字符,如果不存在输出-1
示例1
输入
asdfasdfo
aabb
复制
o
-1
import java.util.*;
public class Main{
public static void main(String[]args){
Scanner input=new Scanner(System.in);
ArrayList<String>list=new ArrayList<>();
while(input.hasNext()){
list.add(input.nextLine());
}
for(String str:list){
Map<Character,Integer>map=new HashMap<>();
for(int i=0;i<str.length();++i){
char x=str.charAt(i);
if(!map.containsKey(x)){
map.put(x,1);
}else{
map.put(x,map.get(x)+1);
}
}
boolean flag=false;
for(int i=0;i<str.length();++i){
char x=str.charAt(i);
if(map.get(x)==1){
System.out.println(x);
flag=true;
break;
}
}
if(!flag){
System.out.println(-1);
}
}
}
}
基本思路:利用HashMap进行一一映射,找到就个数加一,没有就入Map,最终只需要在Map找个数为一的就行。
为什么选取HashMap?
因为HashMap的增删查改时间复杂度都是O(1)。
第二题:
题目描述
输入n个整数,输出其中最小的k个。
本题有多组输入样例,请使用循环读入,比如while(cin>>)等方式处理
输入描述:
第一行输入两个整数n和k
第二行输入一个整数数组
输出描述:
输出一个从小到大排序的整数数组
示例1
输入
5 2
1 3 5 7 2
输出
1 2
import java.util.*;
public class Main{
public static void main(String[]args){
Scanner input=new Scanner(System.in);
while(input.hasNext()){
int n=input.nextInt();
int k=input.nextInt();
PriorityQueue<Integer>queue=new PriorityQueue<>(
new Comparator<Integer>(){
public int compare(Integer o1,Integer o2){
return o2-o1;
}
}
);
for(int i=0;i<n;++i){
int x=input.nextInt();
if(i<k){
queue.offer(x);
}else{
if(x<queue.peek()){
queue.poll();
queue.offer(x);
}
}
}
ArrayList<Integer>list=new ArrayList<>();
for(int x:queue){
list.add(x);
}
Collections.sort(list);
for(int x:list){
System.out.print(x+" ");
}
System.out.println();
}
}
}
基本思路:建立一个大根堆,先入上K个值,然后堆顶一定是最大的,所以只需要用堆顶元素和K之后的元素进行比较,堆顶元素大就出堆,然后当前元素入堆,最终堆中剩下的就只有K个最小的元素了,下来就只用排序输出了。
注意:集合当中的PriorityQueue默认建立的是小根堆,所以需要重写比较器。
第三题:
题目描述
输入两个用字符串表示的整数,求它们所表示的数之和。
字符串的长度不超过10000。
本题含有多组样例输入。
输入描述:
输入两个字符串。保证字符串只含有’0’~'9’字符
输出描述:
输出求和后的结果
示例1
输入
9876543210
1234567890
输出
11111111100
import java.util.*;
public class Main{
public static void main(String[]args){
Scanner input=new Scanner(System.in);
ArrayList<String>list=new ArrayList<>();
while(input.hasNext()){
String str1=input.next();
StringBuilder s1=new StringBuilder();
s1.append(str1);
String str2=input.next();
StringBuilder s2=new StringBuilder();
s2.append(str2);
StringBuilder end=new StringBuilder();
while(s1.length()<s2.length()){
s1.insert(0,'0');
}
while(s1.length()>s2.length()){
s2.insert(0,'0');
}
int c=0;
for(int i=s1.length()-1;i>=0;i--){
char x=s1.charAt(i);
char y=s2.charAt(i);
int re=(x-'0')+(y-'0')+c;
if(re<10){
end.insert(0,re);
c=0;
}else{
end.insert(0,re%10);
c=1;
if(i==0){
end.insert(0,c);
}
}
}
System.out.println(end.toString());
}
}
}
基本思路:
由于输入的字符串长度可能很长,Long类型的数的长度也没有多长,所以就排除了通过Integer.valueOf取转化再计算了。那难道没办法了吗?不!其实很简单,只需要对字符串从后往前,一位一位算就可以了,但要考虑清楚是否有进位。每计算一位就连接一位,得到最终结果。
每天督促自己,一起加油!!!!!!!!!!!
同时有更好的做法的,欢迎讨论。