蓝桥杯历年试题【错误数据】

  • 这题卡了很久,虽然是简单的题,但对于Java的新手来说主要的难点在两个方面:
  1. 输入输出处理,即 hasNext(), hasNextLine(), hasNextInt() 这些放到 while 循环里究竟意味着什么
  2. Java中一些便捷函数的使用,即 split(), valueOf() 以及List, ArrayList, Collection 之间的相互关系
  • hasNext() 判断下一个输入是否为空字符,空字符指 空格‘ ’、字符串结尾‘\0' 
  • hasNextLine() 判断下一个输入是否为空字符串,空字符串指 “”
  • split() 用括号内的字符分割字符串,其中牵涉到正则表达式,若要分割不确定有几个空格或Tab键的字符串,可用String.spilt("\\s+"),而不使用String.split(" ")
  • valueOf() 和parseInt() 用法相似,不过valueOf() 返回Integer对象,parseInt() 返回int,而且二者在字符串后加整数,即可把整数的进制转换为10进制
  • Collection是个接口(常用作集合用),它下面有两个子接口分别为(1)List(2)Set
    其中List是有序可重复集,set是无序不可重复集。
    List又分为三类(1)ArrayList(2)LinkList(3)Vector
    ArrayList内部由数组实现,适合查询;
    LinkList内部由链表实现,适合增删改。
    Vector几乎用不到
    Set又分为(1)HashSet(2)treeSet
    treeSet是二叉树,有序的
    HashSet采用散列存储,是无序的。
    另外Collection是集合的接口  ,Collections是集合的工具类

以下是忽略n也不管几个空格,直接用nextInt输入的最简单的AC代码,用了冒泡排序

import java.util.Scanner;
public class Main{
	public static void main(String []args){
		Scanner in = new Scanner(System.in);
		int n=in.nextInt();
		in.nextLine();
		int []arr=new int[10005];
		int i=0;
		while(in.hasNextInt()){
			int x=in.nextInt();
			arr[i++]=x;
		}
		for(int j=0;j<i;j++){
			for(int k=j+1;k<i;k++){
				if(arr[j]>arr[k]){
					int temp=arr[j];
					arr[j]=arr[k];
					arr[k]=temp;
				}
			}
		}
		int tm=-1,tn=-1;
		for(int j=0;j<i;j++){
			if(arr[j]==arr[j+1]){
				tn=arr[j];
			}
			if(arr[j]+2==arr[j+1]){
				tm=arr[j]+1;
			}
		}
		System.out.println(tm+" "+tn);
	}
}

以下是网上找的代码,可我测试的不确定的多个空格的输入程序崩了,而每个数中间间隔一个空格的输入是完全正确的,提交的结果是100分

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		String[] s = new String[n];
		String[][] s1 = new String[n][];
		in.nextLine();
		for(int i=0; i<n; i++) {
			s[i] = in.nextLine();
			s1[i] = s[i].split(" ");
		}
		ArrayList<Integer> list = new ArrayList<Integer>();
		for(int i=0; i<n; i++)
			for(int j=0; j<s1[i].length; j++) {
				list.add(Integer.valueOf(s1[i][j]));
			}
		Collections.sort(list);
		int a=0,b=0;
		for(int i=0; i<list.size()-1; i++) {
			if(list.get(i+1)-list.get(i)==0) {
				a = list.get(i);
			}
			if(list.get(i+1)-list.get(i)==2) {
				b = list.get(i)+1;
			}
		}
		System.out.println(b+" "+a);
	}
}

下面是提交结果50分的代码,第二个测试点没过,因为没有VIP,看不到第二组数据,如果有第二组数据的希望可以到评论区评论,还有,如果有发现我代码问题的也欢迎在评论区赐教,不甚感激~~

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		in.nextLine();
		ArrayList<Integer> al = new ArrayList<Integer>();
		while(n-->0){
			String rid=in.nextLine();//每一行的id号
			String[] allid=rid.split(" ");//把行id通过空格分割开
			for(int i=0;i<allid.length;i++){
				if(allid[i].equals(""))//如果分割后是空字符串,即出现连续空格
					continue;
				int id=Integer.parseInt(allid[i]);//如果非空字符串,则转为整数,加入al
				al.add(id);
			}
		}
		Collections.sort(al);
		int a=0,b=0;
		for(int i=0; i<al.size()-1; i++) {
			if(al.get(i+1)-al.get(i)==0) {
				a = al.get(i);
			}
			if(al.get(i+1)-al.get(i)==2) {
				b = al.get(i)+1;
			}
		}
		System.out.println(b+" "+a);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值