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

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

作者: 林祖朋 | 来源:发表于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