今天更一下第四章的题目。
首先我要吐槽一下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; } }