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;
}
}