督促自己——某客网编程题三道(Java)——字符串、集合、数组

某客网编程题三道(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取转化再计算了。那难道没办法了吗?不!其实很简单,只需要对字符串从后往前,一位一位算就可以了,但要考虑清楚是否有进位。每计算一位就连接一位,得到最终结果。
在这里插入图片描述

每天督促自己,一起加油!!!!!!!!!!!
同时有更好的做法的,欢迎讨论。

猜你喜欢

转载自blog.csdn.net/qq_45841205/article/details/115218934
今日推荐