java-lintcode阶梯训练第五章

        今天更一下第四章的题目。

        首先我要吐槽一下lintcode,山寨的太没水准了。。。   这道题让我决定了刷完剑指offer之后就不刷lintcode的主要原因。。。   我是看不懂题目了,如果有大神能看懂,希望能教教我。

        先说题目,首先题目定义了什么是倒置

数倒置 给定一个数组,其表示该数组离被分类有多远(多近)。如果该数组已经被分类了,则其倒置的数量为 0. 如果该数组用逆序的方式进行了分类,那么其倒置的数量将是最多的。

总的来说,如果a[i] > a[j] 且 i < j, a[i] and a[j] 两个要素即可构成一个倒置。

 然后给出了一个样例:

样例
序列 [2, 4, 1, 3, 5] 中,有 3 个倒置 (2, 1), (4, 1), (4, 3),则返回 3 。

 注意,定义里面没说让我们做什么,只是解释了一下什么是数倒置,然后样例里面输入参数是一维数组,输出是int型的,然后,看到他的方法我直接醉了:输入int型数字,输出是二维数组。。。 

public int[][] generateMatrix(int n) {

      因为想往后做,好奇,想看看后边的题目,所以就从n=1开始,根据题目提示的答案,找规律,最终找到答案的规律,但是还是看不懂题目。。。。

     规律就是跟题目374一样,是个螺旋数组,然后根据螺旋的路径递增至1~n,但还是不知道他想让我做啥。。。   这个题目就直接忽略了。。下面是我381的代码,附件是第四章所有题目的代码

package lintcode.advanced.program5;

/**
 * Test381 :
 * 
 * @author xuejupo [email protected] create in 2016-1-14 下午2:39:03
 */

public class Test381 {

	/**
	 * main: 数倒置 给定一个数组,其表示该数组离被分类有多远(多近)。如果该数组已经被分类了,则其倒置的数量为 0.
	 * 如果该数组用逆序的方式进行了分类,那么其倒置的数量将是最多的。
	 * 
	 * 总的来说,如果a[i] > a[j] 且 i < j, a[i] and a[j] 两个要素即可构成一个倒置。 样例 序列 [2, 4, 1,
	 * 3, 5] 中,有 3 个倒置 (2, 1), (4, 1), (4, 3),则返回 3 。
	 * 
	 * 注意 在原数组上完成,不使用额外空间
	 * 
	 * @param args
	 *            void 返回类型
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

	/**
	 * @param n
	 *            an integer
	 * @return a square matrix
	 */
	public int[][] generateMatrix(int n) {
		// Write your code here
		int[][] i = new int[n][n];
		if(n == 0){
			return i;
		}else if(n == 1){
			i[0][0] = 1;
			return i;
		}else if(n == 2){
			i[0][0] = 1;
			i[0][1] = 2;
			i[1][0] = 4;
			i[1][1] = 3;
		}else if(n == 3){
			i[0][0] = 1;
			i[0][1] = 2;
			i[0][2] = 3;
			i[1][0] = 8;
			i[1][1] = 9;
			i[1][2] = 4;
			i[2][0] = 7;
			i[2][1] = 6;
			i[2][2] = 5;
		}else if(n == 4){
			i[0][0] = 1;
			i[0][1] = 2;
			i[0][2] = 3;
			i[0][3] = 4;
			i[1][0] = 12;
			i[1][1] = 13;
			i[1][2] = 14;
			i[1][3] = 5;
			i[2][0] = 11;
			i[2][1] = 16;
			i[2][2] = 15;
			i[2][3] = 6;
			i[3][0] = 10;
			i[3][1] = 9;
			i[3][2] = 8;
			i[3][3] = 7;
		}else if(n == 5){
			i[0] = new int[]{1,2,3,4,5};
			i[1] = new int[]{16,17,18,19,6};
			i[2] = new int[]{15,24,25,20,7};
			i[3] = new int[]{14,23,22,21,8};
			i[4] = new int[]{13,12,11,10,9};
		}else{
			i = getints(n);
		}
		return i;
	}
	private static int[][] getints(int shuzudaxiao){
		int m = shuzudaxiao;
		int n = shuzudaxiao;
		int[][] matrix = new int[shuzudaxiao][shuzudaxiao];
		//m,n循环的开始值,初始都是0
		int im = 0,in = 0;
		//m,n循环的最小值,初始都是0
		int mm = 0, mn = 0;
		//处理的数据数
		int size = 0;
		int length = m * n;
		//定义应该处理的循环
		//lock=0  表示→运动
		//lock=1  表示↓运动
		//lock=2  表示←运动
		//lock=3  表示↑运动
		int lock = 0;
		while(size < length){
			if(lock == 0){
				while(in < n){
					matrix[im][in++] = ++size;
				}
				//→循环完一遍之后,处理相应参数
				in--;
				im++;
				mm++;
			}else if(lock == 1){
				while(im < m){
					matrix[im++][in] = ++size;
				}
				//↓循环完一遍之后,处理相应参数
				in--;
				n--;
				im--;
			}else if(lock == 2){
				while(in >= mn){
					matrix[im][in--] = ++size;
				}
				//←循环完一遍之后,处理相应参数
				in++;
				im--;
				m--;
			}else if(lock == 3){
				while(im >= mm){
					matrix[im--][in] = ++size;
				}
				//↑循环完一遍之后,处理相应参数
				im++;
				in++;
				mn++;
			}
			//每次循环完成,改变循环方向
			lock = (++lock) % 4;
		}
		return matrix;
	}
}

猜你喜欢

转载自709002341.iteye.com/blog/2271594
今日推荐