笔试(ACM)的输入输出常用案例

案例

数组

1,输入一个整数,浮点数,输入一个数组 ;

package april;

import java.util.Arrays;
import java.util.Scanner;

public class Class_3 {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in) ;
        while(reader.hasNext())
        {
            int m = reader.nextInt() ;
            int [] numbers = new int[m] ;
            for(int index=0;index<m;index++)
            {
                numbers[index] = reader.nextInt();
            }
            System.out.println(Arrays.toString(numbers));
        }
        reader.close() ;
    }
}
输入:
2
1 3
输出:
[1,3]

案例

package 内推笔试;
 
import java.util.Arrays;
import java.util.Scanner;
 
/**
 * Created by liuming on 2017/8/26.
 */
public class 滴滴 {
 
    /**
     * 给定整数序列求最大连续字串和
     * <p>
     * 问题描述:
     * 给定无序正数序列,求连续字串最大和,例如:{-23,17,-7,11,-2,1,34},字串为{17,-7,11,},最大和为21
     */
    public static int getTargetMax(int[] arr) {
        int max = arr[0];
        int tmpMax = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (tmpMax <= 0)
                tmpMax = arr[i];
            else
                tmpMax += arr[i];
            if (tmpMax > max) {
                max = tmpMax;
            }
        }
        return max;
    }
 
    public static void main1(String[] args) {
        Scanner sc = new Scanner(System.in);
        //获取输入的整数序列
        String str = sc.nextLine();
        String[] strings = str.split(" ");
        //转为整数数组
        int[] ints = new int[strings.length];
        for (int i = 0; i < strings.length; i++) {
            ints[i] = Integer.parseInt(strings[i]);
        }
        System.out.println(getTargetMax(ints));
    }
 
    /**
     * 整数无序数组求第K大数
     * <p>
     * 问题描述:
     * 给定无序整数序列,求其中第K大的数,例如{45,67,33,21},第2大的数为45
     */
    public static int getTopK(int[] arr, int k) {
        Arrays.sort(arr);
        return arr[arr.length - k];
    }
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //获取输入的整数序列
        String str = sc.nextLine();
        String[] strings = str.split(" ");
        //转为整数数组
        int[] ints = new int[strings.length];
        for (int i = 0; i < strings.length; i++) {
            ints[i] = Integer.parseInt(strings[i]);
        }
        int k = sc.nextInt();
        System.out.println(getTopK(ints, k));
    }
 
}

每行参数个数不确定(输入字符串分割为数组)

先用scanner.nextLine()读入字符串,再将字符串分割为字符数组或字符串数组。

import java.util.*;

public class MyScanner4 {
public static void main(String[] args) {
	
	Scanner sc = new Scanner(System.in);	
	System.out.println("输入字符串数组:");
	
	String str;
	str = sc.nextLine();
	
	char[] ch = new char[str.length()];
	for(int i=0; i<str.length(); i++) {
		//用charAt();进行定位分隔
		ch[i] = str.charAt(i);
		System.out.println(ch[i] + " ");
	}
	System.out.println("END");
	
	//读入字符串后,用空格分隔为数组
	String[] strs = str.split(" ");
	System.out.println(Arrays.toString(strs));
 
	}
}

每行参数个数确定

import java.util.Scanner;

public class ChooseSeat {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()) {
            int n = in.nextInt();   // 读第一行的参数
            int[] nums = new int[n];  // 创建数组
            for(int i = 0; i < n; i++) {
                nums[i] = in.nextInt();  // 不停的读入元素
            }
        }
        in.close();
    }
}

矩阵

数组大小确定

package april;
import java.util.Scanner;
public class Class_4 {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        int m = reader.nextInt();
        int n = reader.nextInt() ;
        int [][] array = new int[m][n] ;
        for (int i=0 ; i<m ; i++)
            for(int j=0 ;j<n ;j++)
            {
                array[i][j]=reader.nextInt();
            }
        reader.close() ;
        /**
         * 对矩阵按行打出
         */
        for (int i=0 ; i<m ; i++)
        {
            for(int j=0 ;j<n ;j++)
            {
                System.out.print(array[i][j]+" ");
            }
            System.out.println( );
        }
    }
}
输入:
2  2
1  2
2  1
输出:
1  2
2  1

大小 不确定

//输入一个整数矩阵,矩阵的长度和宽度不确定,可以用于输入n*n的矩阵
public void aMatrix(){
		Scanner sc = new Scanner(System.in);
		ArrayList matrix=new ArrayList();//整个矩阵
		ArrayList alinelist;//每一列
		int length=0;//一列的长度
		System.out.println("请输入一个矩阵:");
	//获得下一行
	while (sc.hasNextLine()) {
		String str = sc.nextLine();
		if (str.equals(""))//输入空行则完成输入,退出循环
			break;
		
		alinelist=new ArrayList();
		
		int pre=0;//扫描指针
		int i=0;
		int temp=0;
		for (i = 0; i < str.length(); i++) {
			if (str.charAt(i) == ' ') {
				temp = Integer.parseInt(str.substring(pre, i));
				alinelist.add(temp);
				pre = i + 1;
			}
		}
		temp = Integer.parseInt(str.substring(pre, i));
		alinelist.add(temp);
		matrix.add(alinelist);
		
		if(length<alinelist.size())
			length=alinelist.size();
	}
	//复制到数组中
	int array [] []=new int [matrix.size()][length];
	//调用函数计算数量
	
	for(int i=0;i<matrix.size();i++){
		alinelist=(ArrayList) matrix.get(i);
		for(int j=0;j<alinelist.size();j++){
			array[i][j]=(int)alinelist.get(j);
			System.out.print(array[i][j]+" ");
		}
		System.out.println();
	}
}

输入为一个链表

这里选用最经典的反转链表题目作为例子。

package learnACM;

import java.util.Scanner;
import java.util.Stack;

public class LinkListInput {
    //题目描述
    //对于一个链表 L: L0→L1→…→Ln-1→Ln,
    //将其翻转成 L0→Ln→L1→Ln-1→L2→Ln-2→…

    //先构建一个节点类,用于链表构建
    static class LinkNode {
        int val;
        LinkNode next;
        public LinkNode(int val){
            this.val = val;
        }
    }

    public static void main(String[] args){
        //输入是一串数字,请将其转换成单链表格式之后,再进行操作
        //输入描述:
        //一串数字,用逗号分隔
        //输入
        //1,2,3,4,5
        Scanner scanner = new Scanner(System.in);
        //以字符串形式作为输入
        String str = scanner.next().toString();
        //通过分隔符将其转为字符串数组
        String[] arr  = str.split(",");
        //初始化一个整数数组
        int[] ints = new int[arr.length];
        //给整数数组赋值
        for(int j = 0; j<ints.length;j++) {
            ints[j] = Integer.parseInt(arr[j]);
        }
        Stack<LinkNode> stack = new Stack<>();
        LinkNode head = new LinkNode(0);
        LinkNode p = head;
        //链表初始化并放入stack中
        for(int i = 0; i < ints.length; i++){
            p.next = new LinkNode(ints[i]);
            p = p.next;
            stack.add(p);
        }
        head = head.next;
        //开始链表转换
        p = head;
        LinkNode q = stack.peek();
        while ((!p.equals(q)) && (!p.next.equals(q))) {
            q = stack.pop();
            q.next = p.next;
            p.next = q;
            p = p.next.next;
            q = stack.peek();
        }
        q.next = null;
        //输出
        //1,5,2,4,3
        //打印
        while (head != null) {
            if(head.next == null){
                System.out.print(head.val);
            }else{
                System.out.print(head.val + ",");
            }
            head = head.next;
        }
    }
}

先创建一个stack,把数组遍历放入stack。
创建头结点head,头结点指针p,查看的栈顶元素q,while循环

while ((!p.equals(q)) && (!p.next.equals(q))) {
    q = stack.pop();
    q.next = p.next;
    p.next = q;
    p = p.next.next;
    q = stack.peek();
}

把q的next指向空,q.next = null;

输入为一个链表(第二种方法)

 public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            String str = in.nextLine();
            int k = in.nextInt();
            ListNode head = new ListNode(-1);
            ListNode p = head;
            String[] strArray = str.split(" ");
            for(int i = 0; i < strArray.length - 1; i++){
                p.next = new ListNode(Integer.parseInt(strArray[i]));
                p = p.next;
            }
            head = reverseK(head.next, k);
            printList(head);
        }
    }
        // 输出处理
    private static void printList(ListNode head) {
        while(head != null){
            System.out.print(head.val);
            if(head.next != null){
                System.out.print("->");
            }
            head = head.next;
        }
    }

List转Int数组 (逐个复制)*

Scanner sc = new Scanner(System.in);
ArrayList arrayList = new ArrayList<>();
while (sc.hasNext()){

arrayList.add(sc.next());//nextLine()/next()看情况使用

}
List<Integer> list = new ArrayList<Integer>();
//LinkedList<Integer> list = new LinkedList<Integer>();
 list.add(1);
 list.add(2);
 int count = list.size();
        int[] aux = new int[count];
        for(int i = 0; i < count; i++){
            aux[i] = list.poll();
        }
        return aux;

数组变树

这里

易错

问题:Java中nextInt()后接nextLine()读取不到数据

愿意:nextInt()函数在缓冲区中遇到“空格”、“回车符”等空白字符时会将空白字符前的数据读取走,但空白字符不会被处理掉,而nextLine()函数是在缓冲区中读取一行数据,这行数据以“回车符”为结束标志,nextLine()会把包括回车符在内的数据提走。所以nextInt()后的nextLine()函数并非读取不到数据,因为nextInt()将“回车符”留在了缓冲区,nextLine()读取时遇到的第一个字符便是“回车符”,所以直接结束了。

解决:
1.在要使用nextLine()前先调用一次nextLine(),这样留在缓冲区的“回车符”就会被处理掉,这时第二个nextLine()函数可以正常读取到数据

sc.nextline() 相当于光标换到下一行
在这里插入图片描述
在这里插入图片描述
避免在nextLine()之前调用nextInt()等函数,可以统一使用nextLine()来读取数据,之后再进行类型转换。

总结:
nextInt()或者next()读取完毕并回车之后其后紧跟nextLine(),就会导致nextLine()读取到空值,因为nextLine()自动读取到’\n',意味着遇到结束符;

有时候将字符串转为整数时,代码没问题却提示数组越界,往往是因为字符串代表的整数超过了int的最值,需要改用long

总结

不确定数组大小可以用list再转数组

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一.数论 4 1.阶乘最后非零位 4 2. 模线性方程(组) 4 3. 素数表 6 4. 素数随机判定(miller_rabin) 6 5. 质因数分解 7 6. 最大公约数欧拉函数 8 二.图论_匹配 9 1. 二分图最大匹配(hungary邻接表形式) 9 2. 二分图最大匹配(hungary邻接表形式,邻接阵接口) 10 3. 二分图最大匹配(hungary邻接阵形式) 10 4. 二分图最大匹配(hungary正向表形式) 11 5. 二分图最佳匹配(kuhn_munkras邻接阵形式) 11 6. 一般图匹配(邻接表形式) 12 7. 一般图匹配(邻接表形式,邻接阵接口) 13 8. 一般图匹配(邻接阵形式) 14 9. 一般图匹配(正向表形式) 15 三.图论_生成树 16 1. 最小生成树(kruskal邻接表形式) 16 2. 最小生成树(kruskal正向表形式) 17 3. 最小生成树(prim+binary_heap邻接表形式) 19 4. 最小生成树(prim+binary_heap正向表形式) 20 5. 最小生成树(prim+mapped_heap邻接表形式) 21 6. 最小生成树(prim+mapped_heap正向表形式) 22 7. 最小生成树(prim邻接阵形式) 23 8. 最小树形图(邻接阵形式) 24 四.图论_网络流 25 1. 上下界最大流(邻接表形式) 25 2. 上下界最大流(邻接阵形式) 26 3. 上下界最小流(邻接表形式) 27 4. 上下界最小流(邻接阵形式) 29 5. 最大流(邻接表形式) 30 6. 最大流(邻接表形式,邻接阵接口) 31 7. 最大流(邻接阵形式) 32 8. 最大流无流量(邻接阵形式) 32 9. 最小费用最大流(邻接阵形式) 33 五. 图论_最短路径 34 1. 最短路径(单源bellman_ford邻接阵形式) 34 2. 最短路径(单源dijkstra_bfs邻接表形式) 35 3. 最短路径(单源dijkstra_bfs正向表形式) 35 4. 最短路径(单源dijkstra+binary_heap邻接表形式) 36 5. 最短路径(单源dijkstra+binary_heap正向表形式) 37 6. 最短路径(单源dijkstra+mapped_heap邻接表形式) 38 7. 最短路径(单源dijkstra+mapped_heap正向表形式) 39 8. 最短路径(单源dijkstra邻接阵形式) 40 9. 最短路径(多源floyd_warshall邻接阵形式) 40 六. 图论_连通性 41 1. 无向图关键边(dfs邻接阵形式) 41 2. 无向图关键点(dfs邻接阵形式) 42 3. 无向图块(bfs邻接阵形式) 43 4. 无向图连通分支(bfs邻接阵形式) 43 5. 无向图连通分支(dfs邻接阵形式) 44 6. 有向图强连通分支(bfs邻接阵形式) 44 7. 有向图强连通分支(dfs邻接阵形式) 45 8. 有向图最小点基(邻接阵形式) 46 七. 图论_应用 46 1.欧拉回路(邻接阵形式) 46 2. 前序表转化 47 3. 树的优化算法 48 4. 拓扑排序(邻接阵形式). 49 5. 最佳边割集 50 6. 最佳顶点割集 51 7. 最小边割集 52 8. 最小顶点割集 53 9. 最小路径覆盖 55 八. 图论_NP搜索 55 1. 最大团(n小于64)(faster) 55 2. 最大团 58 九. 组合 59 1. 排列组合生成 59 2. 生成gray码 60 3. 置换(polya) 61 4. 字典序全排列 61 5. 字典序组合 62 6. 组合公式 62 十. 数值计算 63 1. 定积分计算(Romberg) 63 2. 多项式求根(牛顿法) 64 3. 周期性方程(追赶法) 66 十一. 几何 67 1. 多边形 67 2. 多边形切割 70 3. 浮点函数 71 4. 几何公式 76 5. 面积 78 6. 球面 79 7. 三角形 79 8. 三维几何 81 9. 凸包(graham) 89 10. 网格(pick) 91 11. 圆 92 12. 整数函数 94 13. 注意 96 十二. 结构 97 1. 并查集 97 2. 并查集扩展(friend_enemy) 98 3. 堆(binary) 98 4. 堆(mapped) 99 5. 矩形切割 99 6. 线段树 100 7. 线段树扩展 102 8. 线段树应用 105 9. 子段和 105 10. 子阵和 105 十三. 其他 106 1. 分数 106 2. 矩阵 108 3. 日期 110 4. 线性方程组(gauss) 111 5. 线性相关 113 十四. 应用 114 1. joseph 114 2. N皇后构造解 115 3. 布尔母函数 115 4. 第k元素 116 5. 幻方构造 116 6. 模式匹配(kmp) 118 7. 逆序对数 118 8. 字符串最小表示 119 9. 最长公共单调子序列 119 10. 最长子序列 120 11. 最大子串匹配 121 12. 最大子段和 122 13. 最大子阵和 123
ACM 输入输出主要是指在ACM编程竞赛中,处理输入和输出数据的方式。 在C#中,处理ACM输入输出通常需要使用Console.ReadLine()和Console.WriteLine()方法来获取输入和输出数据。通过使用这些方法,我们可以读取标准输入流中的数据并将结果输出到标准输出流中。 根据引用,在处理ACM输出时,如果题目要求在输出样例中每组样例之间有特定的分隔符(如换行或空格),我们可以在输出每组样例后判断是否是最后一组,如果不是则输出相应的分隔符,如果是最后一组则直接结束。 根据引用,在处理ACM输出时,我们可以使用一个布尔变量来判断是否是第一组输出。如果是第一组,则输出后将布尔变量设置为false;则,输出每组样例前先输出分隔符,并输出每组样例。 以下是一个示例代码,演示了如何使用C#处理ACM输入输出: using System; using System.Collections.Generic; using System.Linq; namespace ACMExample { class Program { static void Main() { int n = int.Parse(Console.ReadLine()); bool isFirst = true; while (n-- > 0) { List<int> a = new List<string>(Console.ReadLine().Split()).ConvertAll(i => int.Parse(i)); if (isFirst) { isFirst = false; } else { Console.WriteLine(); } Console.WriteLine(a + a); } Console.ReadKey(); } } } 在这个示例中,我们首先读取一个整数n,表示有多少组输入。然后,使用一个布尔变量isFirst来判断是否是第一组输出。接下来的while循环中,我们使用Console.ReadLine()方法读取每组输入数据,并使用Console.WriteLine()方法输出每组数据的运算结果。最后,使用Console.ReadKey()方法来等待用户按下任意键以结束程序。 希望以上的解答能帮助到您。如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值