2个算法题,求解

arthur.dy.lee 2015-08-19 10:43:04
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)
请考虑是否可以在函数体中只用一条循环语句就完成螺旋矩阵的构建?如可以,请说明思路,并完成函数体中的部分。
...全文
401 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
夜如烟 2015-09-13
  • 打赏
  • 举报
回复
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(); } } }
arthur.dy.lee 2015-09-13
  • 打赏
  • 举报
回复
引用 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]
*/
不对
arthur.dy.lee 2015-09-13
  • 打赏
  • 举报
回复
引用 3 楼 ITjavaman 的回复:
[quote=引用 2 楼 paincupid 的回复:] 第二题有会的吗
你第二题没看懂,样例打错了还是? [/quote] 照原样打的,拍了张照片。原题就是这样的
ITjavaman 2015-09-06
  • 打赏
  • 举报
回复
引用 2 楼 paincupid 的回复:
第二题有会的吗
你第二题没看懂,样例打错了还是?
arthur.dy.lee 2015-09-06
  • 打赏
  • 举报
回复
第二题有会的吗
gukuitian 2015-09-06
  • 打赏
  • 举报
回复
	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]

*/
gukuitian 2015-09-06
  • 打赏
  • 举报
回复

	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]
*/
  • 打赏
  • 举报
回复
第二道,方法比较笨
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();
		}
	}
}
ITjavaman 2015-08-20
  • 打赏
  • 举报
回复
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; }

51,397

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧