案例

数组

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() 相当于光标换到下一行

acm模式java输出数组 acm模式输入一个数组java_System


acm模式java输出数组 acm模式输入一个数组java_java_02


避免在nextLine()之前调用nextInt()等函数,可以统一使用nextLine()来读取数据,之后再进行类型转换。

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

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

总结

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