2个算法题,求解

时间:2022-03-03 11:16:49
1、有一个整数数组,从小到大排列,其中有一些数字是连续的,比如:[28,29,30], [35,36,37], [87,88], [101,102,103,104,105,106]四个数组的数字组成的,请编写一个函数来把一个整数数组分成多个连续数字构成的数组,函数声明如下:
public in[][] split(int[] integerArray)
请说明思路,并完成函数体中的部分,请注意性能。

2、给定一个正整数n,构造一个n*n 维的矩阵,从1,2,........到n*n使其位置的轨迹构成一个螺旋状,举例来说,如果给定n=5,则矩阵看起来如下:
1 10、2 11、3 12、4 13、5
16 14、17 15、18 16、19 17、6
15 18、24 19、25 20、20 21、7
14 22、23 23、22 24、21 25、8
13 26、12 27、11 28、10 29、9
函数声明如下:
public int[][] getScrewMatrix(int n)
请考虑是否可以在函数体中只用一条循环语句就完成螺旋矩阵的构建?如可以,请说明思路,并完成函数体中的部分。

9 个解决方案

#1


public static int[][] split(int[] integerArray){
//存放二维数组里每一个数组的长度
int [] sz = new int [integerArray.length]; 
int num=0, i = 1;
//获取二维数组里每一个数组的长度
ifor:for(; i<=integerArray.length; i++){
if(num == integerArray.length-1){
break;
}
jfor:for(int j=num;j<integerArray.length;j++){
if(j==integerArray.length-1){
sz[i-1]=j+1-num;
break ifor;
}
if(integerArray[j+1]-integerArray[j]!=1){
sz[i-1]=j+1-num;
num=j+1;
break jfor;
}
}

}
//设置二维数组里每一个一维数组的长度
int [][] ewsz= new int [i][];
for(int x=0; x<i; x++){
 ewsz[x]= new int [sz[x]];
}
//分离数组integerArray
int k=0;
for(int x =0; x<ewsz.length; x++){
for(int y =0; y<ewsz[x].length; y++){
if(x==0){
ewsz[x][y]=integerArray[y];
}else{
ewsz[x][y]=integerArray[y+k];
}
}
k=k+ewsz[x].length;
}
return ewsz;
}

#2


第二题有会的吗

#3


引用 2 楼 paincupid 的回复:
第二题有会的吗

你第二题没看懂,样例打错了还是?

#4


第二道,方法比较笨
import java.util.Scanner;

public class SpiralArray {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n = s.nextInt();
int[][] a = new int[n][n];
s.close();
int len = n - 1;
int start = 0;
for (int i = 0; i <= n / 2; i++) {
for (int j = i; j < len + i; j++) {
a[i][j] = start - i + j + 1;
a[j][n - i - 1] = a[i][j] + len;
a[n - i - 1][n - j - 1] = a[i][j] + len * 2;
a[n - j - 1][i] = a[i][j] + len * 3;
}
start += len * 4;
len -= 2;
}
if(n % 2 != 0){
a[n/2][n/2] = n * n;
}
for (int[] is : a) {
for (int i : is) {
System.out.print(i + " " + "\t");
}
System.out.println();
}
}
}

#5



public static void test(int num) {
int[][] array = new int[num][num];
int i = 0, j = 0, k = 1, m = 1;
for(int n = 0; n < num * num; n++){
array[i][j] = n + 1;
if (k % 2 != 0){
if (j + m > num - 1 - k / 4 || j + m < k / 4){
k++;
i += m;
continue;
}
j += m;
}else{
if (i + m > num - 1 - k / 4 || i + m < k / 4){
k++;
m = -m;
j += m;
continue;
}
i += m;
}
}
for(int s = 0; s < num; s++){
System.out.println(Arrays.toString(array[s]));
}
}

/*
[1, 2, 3, 4, 5]
[16, 17, 18, 19, 6]
[15, 24, 25, 20, 7]
[14, 23, 22, 21, 8]
[13, 12, 11, 10, 9]
*/

#6


	public static void test1(int[] array){
int start=0;
for(int i=1;i<array.length;i++){
if(array[i]-array[i-1]!=1){
System.out.println(Arrays.toString(Arrays.copyOfRange(array, start, i)));
start=i;
}
if(i==array.length-1){
System.out.println(Arrays.toString(Arrays.copyOfRange(array, start, array.length)));
}
}
}
public static void main(String[] args) {
test1(new int[]{28,29,30, 35,36,37,87,88, 101,102,103,104,105,106});
}
/*
[28, 29, 30]
[35, 36, 37]
[87, 88]
[101, 102, 103, 104, 105, 106]

*/

#7


引用 3 楼 ITjavaman 的回复:
Quote: 引用 2 楼 paincupid 的回复:

第二题有会的吗

你第二题没看懂,样例打错了还是?


照原样打的,拍了张照片。原题就是这样的

#8


引用 5 楼 gukuitian 的回复:

public static void test(int num) {
int[][] array = new int[num][num];
int i = 0, j = 0, k = 1, m = 1;
for(int n = 0; n < num * num; n++){
array[i][j] = n + 1;
if (k % 2 != 0){
if (j + m > num - 1 - k / 4 || j + m < k / 4){
k++;
i += m;
continue;
}
j += m;
}else{
if (i + m > num - 1 - k / 4 || i + m < k / 4){
k++;
m = -m;
j += m;
continue;
}
i += m;
}
}
for(int s = 0; s < num; s++){
System.out.println(Arrays.toString(array[s]));
}
}

/*
[1, 2, 3, 4, 5]
[16, 17, 18, 19, 6]
[15, 24, 25, 20, 7]
[14, 23, 22, 21, 8]
[13, 12, 11, 10, 9]
*/
不对 2个算法题,求解

#9



import java.io.*;
public class RingDemo {
 public static void main(String[] args) {
  String strIn = "";
  System.out.print("请输入矩阵的行列数:");
  InputStreamReader input = new InputStreamReader(System.in);
  BufferedReader buff = new BufferedReader(input);
  try {
   strIn = buff.readLine();
  } catch (IOException e) {
   System.out.println(e.toString());
  }
  int int1 = Integer.parseInt(strIn);
  int n = int1;
  System.out.println("这是行列数为" + n + "的螺线型数组:");
  int intA = 1; // 初始化
  int[][] array = new int[n][n];
  int intB;
  if (n % 2 != 0) {
   intB = n / 2 + 1; // 奇数时i循环次数
  } else
   intB = n / 2; // 偶数时i循环次数
  for (int i = 0; i < intB; i++) { // 从外到里循环
   // 从左到右横的开始
   for (int j = i; j < n - i; j++) {
    array[i][j] = intA;
    intA++;
   }
   // 从上到下纵
   for (int k = i + 1; k < n - i; k++) {
    array[k][n - i - 1] = intA;
    intA++;
   }
   // 从右到左横
   for (int l = n - i - 2; l >= i; l--) {
    array[n - i - 1][l] = intA;
    intA++;
   }
   // 从下到上纵
   for (int m = n - i - 2; m > i; m--) {
    array[m][i] = intA;
    intA++;
   }
  }
  int num=10;
  int[][] array2=new int[n][n];
  for (int i = 0; i < n; i++) {
for (int j = 0; j < n-1; j++) {
array2[i][j]=num;
num++;
}
}
  // 输出数组
  for (int i = 0; i < n; i++) {
   for (int j = 0; j < n; j++) {
   if (j==n-1) {

   System.out.print(array[i][j]+ " ");
}else {

System.out.print(array[i][j]*100+array2[i][j]+ " ");
}
   }
   System.out.println();
  } }
}

#1


public static int[][] split(int[] integerArray){
//存放二维数组里每一个数组的长度
int [] sz = new int [integerArray.length]; 
int num=0, i = 1;
//获取二维数组里每一个数组的长度
ifor:for(; i<=integerArray.length; i++){
if(num == integerArray.length-1){
break;
}
jfor:for(int j=num;j<integerArray.length;j++){
if(j==integerArray.length-1){
sz[i-1]=j+1-num;
break ifor;
}
if(integerArray[j+1]-integerArray[j]!=1){
sz[i-1]=j+1-num;
num=j+1;
break jfor;
}
}

}
//设置二维数组里每一个一维数组的长度
int [][] ewsz= new int [i][];
for(int x=0; x<i; x++){
 ewsz[x]= new int [sz[x]];
}
//分离数组integerArray
int k=0;
for(int x =0; x<ewsz.length; x++){
for(int y =0; y<ewsz[x].length; y++){
if(x==0){
ewsz[x][y]=integerArray[y];
}else{
ewsz[x][y]=integerArray[y+k];
}
}
k=k+ewsz[x].length;
}
return ewsz;
}

#2


第二题有会的吗

#3


引用 2 楼 paincupid 的回复:
第二题有会的吗

你第二题没看懂,样例打错了还是?

#4


第二道,方法比较笨
import java.util.Scanner;

public class SpiralArray {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n = s.nextInt();
int[][] a = new int[n][n];
s.close();
int len = n - 1;
int start = 0;
for (int i = 0; i <= n / 2; i++) {
for (int j = i; j < len + i; j++) {
a[i][j] = start - i + j + 1;
a[j][n - i - 1] = a[i][j] + len;
a[n - i - 1][n - j - 1] = a[i][j] + len * 2;
a[n - j - 1][i] = a[i][j] + len * 3;
}
start += len * 4;
len -= 2;
}
if(n % 2 != 0){
a[n/2][n/2] = n * n;
}
for (int[] is : a) {
for (int i : is) {
System.out.print(i + " " + "\t");
}
System.out.println();
}
}
}

#5



public static void test(int num) {
int[][] array = new int[num][num];
int i = 0, j = 0, k = 1, m = 1;
for(int n = 0; n < num * num; n++){
array[i][j] = n + 1;
if (k % 2 != 0){
if (j + m > num - 1 - k / 4 || j + m < k / 4){
k++;
i += m;
continue;
}
j += m;
}else{
if (i + m > num - 1 - k / 4 || i + m < k / 4){
k++;
m = -m;
j += m;
continue;
}
i += m;
}
}
for(int s = 0; s < num; s++){
System.out.println(Arrays.toString(array[s]));
}
}

/*
[1, 2, 3, 4, 5]
[16, 17, 18, 19, 6]
[15, 24, 25, 20, 7]
[14, 23, 22, 21, 8]
[13, 12, 11, 10, 9]
*/

#6


	public static void test1(int[] array){
int start=0;
for(int i=1;i<array.length;i++){
if(array[i]-array[i-1]!=1){
System.out.println(Arrays.toString(Arrays.copyOfRange(array, start, i)));
start=i;
}
if(i==array.length-1){
System.out.println(Arrays.toString(Arrays.copyOfRange(array, start, array.length)));
}
}
}
public static void main(String[] args) {
test1(new int[]{28,29,30, 35,36,37,87,88, 101,102,103,104,105,106});
}
/*
[28, 29, 30]
[35, 36, 37]
[87, 88]
[101, 102, 103, 104, 105, 106]

*/

#7


引用 3 楼 ITjavaman 的回复:
Quote: 引用 2 楼 paincupid 的回复:

第二题有会的吗

你第二题没看懂,样例打错了还是?


照原样打的,拍了张照片。原题就是这样的

#8


引用 5 楼 gukuitian 的回复:

public static void test(int num) {
int[][] array = new int[num][num];
int i = 0, j = 0, k = 1, m = 1;
for(int n = 0; n < num * num; n++){
array[i][j] = n + 1;
if (k % 2 != 0){
if (j + m > num - 1 - k / 4 || j + m < k / 4){
k++;
i += m;
continue;
}
j += m;
}else{
if (i + m > num - 1 - k / 4 || i + m < k / 4){
k++;
m = -m;
j += m;
continue;
}
i += m;
}
}
for(int s = 0; s < num; s++){
System.out.println(Arrays.toString(array[s]));
}
}

/*
[1, 2, 3, 4, 5]
[16, 17, 18, 19, 6]
[15, 24, 25, 20, 7]
[14, 23, 22, 21, 8]
[13, 12, 11, 10, 9]
*/
不对 2个算法题,求解

#9



import java.io.*;
public class RingDemo {
 public static void main(String[] args) {
  String strIn = "";
  System.out.print("请输入矩阵的行列数:");
  InputStreamReader input = new InputStreamReader(System.in);
  BufferedReader buff = new BufferedReader(input);
  try {
   strIn = buff.readLine();
  } catch (IOException e) {
   System.out.println(e.toString());
  }
  int int1 = Integer.parseInt(strIn);
  int n = int1;
  System.out.println("这是行列数为" + n + "的螺线型数组:");
  int intA = 1; // 初始化
  int[][] array = new int[n][n];
  int intB;
  if (n % 2 != 0) {
   intB = n / 2 + 1; // 奇数时i循环次数
  } else
   intB = n / 2; // 偶数时i循环次数
  for (int i = 0; i < intB; i++) { // 从外到里循环
   // 从左到右横的开始
   for (int j = i; j < n - i; j++) {
    array[i][j] = intA;
    intA++;
   }
   // 从上到下纵
   for (int k = i + 1; k < n - i; k++) {
    array[k][n - i - 1] = intA;
    intA++;
   }
   // 从右到左横
   for (int l = n - i - 2; l >= i; l--) {
    array[n - i - 1][l] = intA;
    intA++;
   }
   // 从下到上纵
   for (int m = n - i - 2; m > i; m--) {
    array[m][i] = intA;
    intA++;
   }
  }
  int num=10;
  int[][] array2=new int[n][n];
  for (int i = 0; i < n; i++) {
for (int j = 0; j < n-1; j++) {
array2[i][j]=num;
num++;
}
}
  // 输出数组
  for (int i = 0; i < n; i++) {
   for (int j = 0; j < n; j++) {
   if (j==n-1) {

   System.out.print(array[i][j]+ " ");
}else {

System.out.print(array[i][j]*100+array2[i][j]+ " ");
}
   }
   System.out.println();
  } }
}