技巧栏练习题

2024-06-17 1489阅读

136. 只出现一次的数字

题干中要求做到线性时间复杂度和常数空间复杂度。

技巧栏练习题
(图片来源网络,侵删)

考虑使用位运算。使用异或运算有以下三个性质:

任何数和0 做异或运算,结果仍然是原来的数。

任何数和其自身做异或运算,结果是 0。

异或运算满足交换律和结合律。

class Solution {
    public int singleNumber(int[] nums) {
        int single = 0;
        for(int num : nums){
            single ^= num;
        }
        return single;
    }
}

169. 多数元素

可以使用哈希映射(HashMap)来存储每个元素以及出现的次数。对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数。

在这之后,我们遍历哈希映射中的所有键值对,返回值最大的键。我们同样也可以在遍历数组 nums 时候使用打擂台的方法,维护最大的值,这样省去了最后对哈希映射的遍历。

class Solution {
    public int majorityElement(int[] nums) {
        // Arrays.sort(nums);
        // return nums[nums.length/2];
        // int votes =0;
        // int candidate=0;
        // for(int num :nums){
        //     if(votes == 0){
        //         candidate = num;
        //     }
        //     votes += (num == candidate) ? 1 : -1;
        // }
        // return candidate;
        int win=nums[0];
        int count=1;
        for(int i=1;i=nums[i+1]){
            i--;
        }
        // 2.找到较大的数
        if(i>=0){
            int j=nums.length-1;
            while(j>=0 && nums[i]>=nums[j]){
                j--;
            }
            // 3.交换
            swap(nums,i,j);
        }
        // 4.翻转
        reverse(nums,i+1);
    }
    public void swap(int[] nums, int i, int j){
        int temp=nums[i];
        nums[i]=nums[j];
        nums[j]=temp;
    }
    public void reverse(int[] nums, int start){
        int left = start, right = nums.length-1;
        while(leftf(n)。从下标为 0 出发,就可以产生一个类似链表一样的序列。 

1.数组中有一个重复的整数 链表中存在环

2.找到数组中的重复整数 找到链表的环入口

class Solution {
    public int findDuplicate(int[] nums) {
        // 这里已经从起点0跳过一步了
        int slow=nums[0];
        int fast=nums[nums[0]];
        // 1.找到快慢指针相遇点
        while(slow!=fast){
            slow=nums[slow];
            fast=nums[nums[fast]];
        }
        // 2.找到入环口
        // 将快指针移回起点0,与慢指针同步移动
        fast=0;
        while(fast!=slow){
            fast=nums[fast];
            slow=nums[slow];
        }
        // 返回指针位置
        return fast;
    }
}

3.原地哈希(如:41. 缺失的第一个证书-)

class Solution {
    public int findDuplicate(int[] nums) {
        for(int i=0; i
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]