编程练习题集——leetcode

这篇博客整理了LeetCode中的编程练习题,包括数组、数学、字符串和链表四个部分,涵盖了简单到中等难度的题目,如可被5整除的二进制前缀、两数之和、删除排序数组中的重复项等,提供了问题描述、解题思路及代码实现。
摘要由CSDN通过智能技术生成

一、数组

1.1、简单

第1题 可被 5 整除的二进制前缀

给定由若干 0 和 1 组成的数组 A。我们定义 N_i:从 A[0] 到 A[i] 的第 i 个子数组被解释为一个二进制数(从最高有效位到最低有效位)。
返回布尔值列表 answer,只有当 N_i 可以被 5 整除时,答案 answer[i] 为 true,否则为 false。
示例1:
输入:[0,1,1]
输出:[true,false,false]
解释:
输入数字为 0, 01, 011;也就是十进制中的 0, 1, 3 。只有第一个数可以被 5 整除,因此 answer[0] 为真。
示例 2:
输入:[1,1,1]
输出:[false,false,false]
代码:

class Solution {
   
    public List<Boolean> prefixesDivBy5(int[] A) {
   
        List<Boolean> list=new ArrayList<Boolean>();
        int length =A.length;       //获取传入的数组的长度
        int a=0;                      //定义变量a用于存放余数
        for(int i=0;i<length;i++){
   
            a=((a<<1)+A[i])%5;          //向左移动1位       (二进制数)
            list.add(a==0);
        }
        return list;
    }
}

思路:设开始的余数为0,数组中的数对5取余,如果能被整除,则余数为0,如果不能不能被整除,就保留这个余数,下一次计算余数放在这个余数后,一直到这个余数为0

第2题 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
代码:

class Solution {
   
    public int[] twoSum(int[] nums, int target) {
   
        for(int i=0;i<nums.length;i++){
   
            for(int j=0;j<nums.length;j++){
   
                if((nums[i]+nums[j])==target){
   				//判断有没有在下标i的情况下有数和他相加的接股票是target;
                    return new int[]{
   i,j};
                }
            }
        }
        return new int[0];						//没有的话就返回一个长度为0的数组
    }
}

思路:枚举这个数组,找到两个数的和为target的两个数,然后返回一个数组,数组中存有着两个数的下标。

第3题 删除排序数组中的重复项

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。
代码:

class Solution {
   
    public int removeDuplicates(int[] nums) {
   
    /*
		0,0,1,1,2,2
		i
			  j
	*/
        if(nums ==null|| nums.length == 0 ){
   
            return 0;
        }
        int i = 0;
        int j = 1;
        while(j < nums.length){
   
            if(nums[i] != nums[j]){
   
                i++;
                nums[i] = nums[j];
            }
            j++;
        }
        return i + 1;
    }
}

思路:定义一个写指针i,读指针j,i从0开始,j从1开始,j最大时就是数组长度减1,
j向后移动,直到j指向的值与i指向的值不相等时,将j指向的值赋给i+1这个位置,然后j向后移动,指向的值继续与写指针指向的值比较。

第3题 移动零

相关标签:数组、双指针
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

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

思路:先定义两个指针,r向右移动,若指向的数不为0,则与l指针指向的数交换位置,l指向的是最左边的那个0.
在这里插入图片描述

第4题 多数元素

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:[3,2,3]
输出:3
示例 2:
输入:[2,2,1,1,1,2,2]
输出:2

class Solution {
   
    public int majorityElement(int[] nums) {
   
        int m = nums[0]; int count = 1;
        for (int i = 1; i < nums.length; i++) {
    
            if (nums[i] == m) {
    count++; 
            } else {
    
                count--; 
                if (count == 0) {
   
                     m = nums[i]; 
                     count = 1; 
                } 
            } 
        }return m;
    }
}

思路:如果两个数不相等,那么就碰撞消亡吧,剩下的全部是同一个数,即答案。

第5题 按奇偶排序数组

给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。
你可以返回满足此条件的任何数组作为答案。
示例:
输入:[3,1,2,4]
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值