美文网首页
初级算法(一)(数组篇)

初级算法(一)(数组篇)

作者: 林祖朋 | 来源:发表于2018-05-11 10:38 被阅读169次

移动零:

给定一个数组 nums, 编写一个函数将所有 0 移动到它的末尾,同时保持非零元素的相对顺序。
例如, 定义 nums = [0, 1, 0, 3, 12],调用函数之后, nums 应为 [1, 3, 12, 0, 0]。
注意事项:
1.必须在原数组上操作,不要为一个新数组分配额外空间。
2尽量减少操作总数。

class Solution {
    public void moveZeroes(int[] nums) {
         int a=0;
         for(int i=0;i<nums.length;i++){
             if(nums[i]!=0){
                 nums[a]=nums[i];
                 a=a+1;
             }
         }
        for (int i=a;i<nums.length;i++){
            nums[i]=0;
        }
    }
}

从排序数组中删除重复项

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

注意事项:
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
例如:int[] nums={1,1,2} 返回2 原数组的前两个元素改为1,2

class Solution {
    public int removeDuplicates(int[] nums) {
        int a=1;
        
        for(int i=1;i<nums.length;i++){
            if(nums[i]>nums[a-1]){
                nums[a]=nums[i];
                a=a+1;
            }
        }
        return a;
    
    }
}

两数之和

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

class Solution {
    public int[] twoSum(int[] nums, int target) {
       int[] result = new int[2];
        for (int i = 0; i < nums.length; i++) {
            
                for (int j = i + 1; j < nums.length; j++) {
                    if (nums[i] + nums[j] == target) {
                        result[0] = i;
                        result[1] = j;
                        break;
                    }
                }
            
        }
        return result;
    }
}

旋转数组

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

示例 1:

输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
示例 2:

输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
说明:

尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
要求使用空间复杂度为 O(1) 的原地算法。

 public void rotate(int[] nums, int k) {
        
        if(nums.length==0||k<0){
            return;
        }
        
        if(nums.length<=k){
           k=k-nums.length;
        }
        
        
        int[] res=new int[nums.length];
        
        for(int i=0;i<nums.length;i++){
            int position=0;
            if(i<k){ 
                 position=nums.length-k+i;
                 res[i]=nums[position]; 
            }else{
                position=i-k;
                res[i]=nums[position];
            }
        }
        
        for(int i=0;i<res.length;i++){
            nums[i]=res[i];
        }
        
        
    
    }

存在重复

给定一个整数数组,判断是否存在重复元素。

如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。

示例 1:

输入: [1,2,3,1]
输出: true
示例 2:

输入: [1,2,3,4]
输出: false
示例 3:

输入: [1,1,1,3,3,4,3,2,4,2]
输出: true

public boolean containsDuplicate(int[] nums) {
        
        if(nums.length<2){ 
            return false; 
        }
        Arrays.sort(nums);
        
        for(int i=1;i<nums.length;i++){
            
                if(nums[i-1]==nums[i]){
                    return true;
                }
            
        }
        
        return false;
        
    }

只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1
示例 2:

输入: [4,1,2,1,2]
输出: 4

public int singleNumber(int[] nums) {
        
        Arrays.sort(nums);
        
        for(int i=0;i<nums.length;i=i+2){
            
                if(i==(nums.length-1)){
                    return nums[i];
                }
            
                if(nums[i]!=nums[i+1]){
                     return nums[i];
                }
            
        }
        
        return 0;
        
    
    }

以上题目均选自领扣网站!!

https://leetcode-cn.com

相关文章

网友评论

      本文标题:初级算法(一)(数组篇)

      本文链接:https://www.haomeiwen.com/subject/rrgxdftx.html