LintCode Java Basic, Integer and Array 第一部分

来源:互联网 发布:中山大学就业 知乎 编辑:程序博客网 时间:2024/05/28 16:11

LintCode Java Basic, Integer and Array 第一部分

这次写的是LintCode Java Basic, Integer and Array第一部分的几道算法题分析,也就是第二单元第一部分的题目,都比较简单。这周是fall学期的第二周,machine learning开始又项目了,其他课程也有作业了,会更加忙碌啦。好了,下面开始看这几道题吧!

第一题:在数组中找到第二大的数
注意事项
你可以假定至少有两个数字
样例
给出 [1, 3, 2, 4], 返回 3.
给出 [1, 2], 返回 1.

这道题我的思路是直接用冒泡排序法排好,然后返回下标为length-2的元素即可,当然也可以用其他排序法,毕竟冒泡排序法不是最优解。所谓冒泡排序法就是从数组的第一个元素开始,与其相邻的元素比较大小,如果比相邻的元素大即交换位置。这样第一轮可以找出数组中最大的元素,第二轮可以找出数组中第二大的元素,直至将所有元素按照从小到大排列好。具体代码如下:

public int secondMax(int[] nums) {    for(int j = 0;j < nums.length-1;j++){        for (int i = 0;i < nums.length-j-1;i++){            if(nums[i] > nums[i+1]){                int temp = nums[i];                nums[i] = nums[i+1];                nums[i+1] = temp;            }        }          }    return nums[nums.length-2];}

第二题:给一个浮点数数组,求数组中的最大值。
样例
给出数组 [1.0, 2.1, -3.3], 返回 2.1.
这道题就是在数组中找到最大的,可以按照上题的思路先排序好,直接返回下标为length-1的元素。这题我的思路是先直接认为第一个元素是最大的,然后让其与其他元素比较,如果其他元素比arr[0]大,就让其取代arr[0],这样通过遍历一遍数组后就可以返回最大值了。代码如下:

public float maxOfArray(float[] A) {    // write your code here    float max = A[0];    for(int i = 1;i < A.length;i++){        if(A[i] > max){            max = A[i];        }    }    return max;}

第三题:判断一个正整数是不是回文数。
回文数的定义是,将这个数反转之后,得到的数仍然是同一个数。
注意事项
给的数一定保证是32位正整数,但是反转之后的数就未必了。
样例
11, 121, 1, 12321 这些是回文数。
23, 32, 1232 这些不是回文数。

这道题我的思路是先将输入的数字反转过来,然后和原来的数字进行比较,相同就返回true,不同就返回false。那么重点就是如何将输入的数字反转,过程应该是取出该数字的各个位,然后乘以相应的10的倍数。主要操作符号是%和/。具体代码如下:

public boolean isPalindrome(int num) {    // write your code here    int onum = num;    int newnum = 0;    do{        int s = num % 10;        newnum = newnum * 10 + s;        num = num / 10;    }while(num != 0);    if(newnum == onum){        return true;    }else{        return false;    }}

第四题:去除重复元素
给一个整数数组,去除重复的元素。

你应该做这些事
1.在原数组上操作
2.将去除重复之后的元素放在数组的开头
3.返回去除重复元素之后的元素个数
注意事项
不需要保持原数组的顺序

样例
给出 nums = [1,3,1,4,4,2],你需要做以下操作
1.将重复元素扔在最后面 => nums = [1,3,4,2,?,?].
2.返回个数 4
实际上我们并不在意?是什么

这道题应该是这几道题中最难的,首先要去除重复的元素,思路是从数组中的第一个元素开始,和数组中的其他元素比较,如果相等,此时要记录该元素的下标,然后将该元素从数组中取出,该元素之后的元素全部前进一位,再将该元素放置到数组末尾。再从刚刚记录的下标开始判断,要注意的是不是刚刚的下标+1,因为我们将后面的元素全部往前移动了一位。反复该操作,结束的标志应该是length-2的元素和第一个元素相等。之后再用第二个元素同样的逻辑判断,这种思路太复杂,而其复杂的原因主要就是数组无序。所以改进为先排序,之后只用遍历一遍改数组,将不同的元素取代。具体代码如下:

public int deduplication(int[] nums) {    // Write your code here     if (nums.length == 0) {        return 0;    }    Arrays.sort(nums);    int len = 0;    for (int i = 0; i < nums.length; i++) {        if (nums[i] != nums[len]) {            nums[++len] = nums[i];        }    }    return len + 1;}
原创粉丝点击