携程编程题汇总

18.05.16

题目1:

给定一个整形数组,将数组中所有的“0”移动到末尾,非0项保持不动,在原数组上进行移动,勿创建新数组。
输入:第一行为数组长度,后续每一行为数组的一条记录
输出:调整后的数组内容
样例:
输入:
4
0
7
0
2
输出
7
2
0
0

思路:

毫无思路可言:将所有非0元素按照顺序向前移动,需要完成一轮遍历+前移,一轮赋0

控制台输入好难啊qaq

代码:

import java.util.Scanner;

class Main(){
	public static void main(String[] args){
		Scanner in = new Scanner(System.in);
		int n =0;
		n =Integer.parseInt(in.nextLine());//不能直接读取nextInt不然容易在数组的第一位读取错误:For input string "",我也不会解决
		StringBuffer sb = new StringBuffer();
		int count=n;
		while(count-->0)
			sb.append(in.nextLine().append(",");
			
		//去除str左右两边的预留空格(不然在分割str为数组的时候第一个位置上总有一个"",后期不可以进行数组转换).trim只能去除半角空格
		  String[] arr = sb.toString().trim().split(",");	
		  	
		  int[] a = new int[n];
		  for(int i=0;i<n;++i)
		  	a[i]=Integer.parseInt(arr[i]);

		putIntoStart(a);
	}

	private static void putIntoStart(int[] arr){
		int j =0;
		for(int i=0;i<arr.length;++i){
			if(arr[i]!=0)
				arr[j++]=arr[i];
		}
		for(;j<arr.length;++j)
			arr[j]=0;
		
		for(int a :arr)
			System.out.println(a);

	}
}

别人的代码:

//由于i代表的是从尾部开始的非0元素,j代表整个的一趟遍历
//j<=i总成立;如果不存在0,则i=j;如果存在0,则j<i
for(int i =arr.length-1;j=arr.length-1;j>0;--j){
	if(char[j]=='0'){
		char temp = char[i];
		char[i] = char[j];
		char[j]=temp;
		i--;
	}
}



题目2:

给定一个N*N的二维矩阵,将该矩阵进行顺时针旋转90度
样例输入
1 4 7
2 5 8
3 6 9
输出:

思路:

输入控制:(本题输入控制是难点)

1、先用Scanner读取第一行的输入数据,然后通过空格拆分后能得到二维矩阵的大小N 2、第二行后一个一个的读取输入数据
问题分析:位置为[i][j]的数字经过旋转后,到了[j][N-1-i]

  • next,nextInt,nextLine区别

next()、nextInt()和nextLine()的使用注意事项: https://blog.csdn.net/m0_37402140/article/details/72801477

代码:

import java.util.Scanner;

class Main{  
  public static void main(String[] args) {
     Scanner in = new Scanner(System.in);
     //本题从控制台读取输入是关键
     while(in.hasNext()) {//写在in.hasNext中无法跳出循环,所以整个过程都在while中进行
	String line = in.nextLine();
   	String[] str = line.split(" ");
   	int n = str.length;
   	int[][] nums = new int[n][n];
   	for(int i=0;i<n;++i)
   		nums[0][i]=Integer.parseInt(str[i]);
 	for(int i=1;i<n;++i)
   	    for(int j =0;j<n;++j)
     		nums[i][j] = in.nextInt();//由于知道了n,所以可以限制数组的行列个数,nextInt按照个数读取
     		//nextInt不读取换行符
     		
   	int[][] res = rotate(nums);
   	for(int i=0;i<n;i++) {
    		for(int j=0;j<n;++j) {
     			System.out.print(res[i][j]+" ");
    		} 
    	System.out.println();
    	   } 
     }
     
 private static int[][] rotate(int[][] nums){
 	 int[][] res = new int[nums.length][nums.length];
	  for(int i=0;i<nums.length;i++)
 		  for(int j=0;j<nums.length;++j)
    			res[j][nums.length-1-i]=nums[i][j];
	  return res;
	 }
}

猜你喜欢

转载自blog.csdn.net/weixin_39345957/article/details/89094229