LintCode Java Basic, Integer and Array 第一部分

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值