代码随想录刷题复盘日记day06

文章介绍了力扣LeetCode中的四个编程题目,涉及整数数组的独一无二出现次数统计、数组旋转、寻找中心下标以及按奇偶排序。使用了哈希法、反转数组和数组操作技巧来解决这些问题。
摘要由CSDN通过智能技术生成

1207.独一无二的出现次数

1207. 独一无二的出现次数 - 力扣(LeetCode)

给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。

1. 哈希法:用数组做哈希,首先将数组中的元素存入哈希数组中,然后遍历arr[i]的所有可能取值,如果这个数之前没出现过,return true;如果出现过,return false;

class Solution {
public:
    bool uniqueOccurrences(vector<int>& arr) {
        int count[20002] = {0};
        for(int i = 0; i < arr.size(); i++) {
            count[arr[i] + 1000]++;
        }
        // 统计是否出现过
        bool fre[1002] = {false};
        for(int i = 0; i <= 2000; i++) {
            if(count[i]) {
            if(fre[count[i]] == false) fre[count[i]] = true;
            else return false;
            }
        }
        return true;
    }
};

189.旋转数组

189. 轮转数组 - 力扣(LeetCode)

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

1. 反转字符串:细节在于要把k编程nums.size()范围里的数

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        k = k % nums.size();
        reverse(nums.begin(), nums.end());
        reverse(nums.begin() + k, nums.end());
        reverse(nums.begin(), nums.begin() + k);

    }
};

2. 申请一个新数组

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> newArr(n);
        for(int i = 0; i < n; i++) {
            newArr[(i + k) % n] = nums[i];
        }
        nums.assign(newArr.begin(), newArr.end());

    }
};

724.寻找数组的中心下标

724. 寻找数组的中心下标 - 力扣(LeetCode)

给你一个整数数组 nums ,请计算数组的 中心下标 

数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。

如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。

1. 根据sum和leftSum计算出rightSum,判断leftSum和rightSum是否相等

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int sum = 0;    
        for(int num : nums) sum += num; // 求和
        int leftSum = 0;    // 左半部分
        int rightSum = 0;   // 右半部分
        for(int i = 0; i < nums.size(); i++) {
            leftSum += nums[i];
            rightSum = sum - leftSum + nums[i];
            if(leftSum == rightSum) return i;
        }
        return -1;
    }
};

922.按奇偶排序数组II

922. 按奇偶排序数组 II - 力扣(LeetCode)

给定一个非负整数数组 nums,  nums 中一半整数是 奇数 ,一半整数是 偶数 。

对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。

1. 暴力解法:首先把奇数存入奇数数组,把偶数存入偶数数组,最后把奇数数组和偶数数组存入结果数组

class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& nums) {
        vector<int> even(nums.size() / 2);
        vector<int> odd(nums.size() / 2);
        vector<int> result(nums.size());
        int evenIndex = 0;
        int oddIndex = 0;
        int resultIndex = 0;
        // 把nums数组放进偶数数组和奇数数组
        for(int i = 0; i < nums.size(); i++) {
            if(nums[i] % 2 == 0) even[evenIndex++] = nums[i];
            else odd[oddIndex++] = nums[i];
        }
        // 把奇数数组和偶数数组存进结果数组
        for(int i = 0; i < evenIndex; i++) {
            result[resultIndex++] = even[i];
            result[resultIndex++] = odd[i];
        }
        return result;
   }
};

2.在一个数组上操作,如果在偶数位遇到奇数,那么就在奇数位找一个偶数存入偶数位

class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& nums) {
        int oddIndex = 1;
        for(int i = 0; i < nums.size(); i += 2) {
            if(nums[i] % 2 == 1) {
                while(nums[oddIndex] % 2 != 0) oddIndex += 2;
                swap(nums[i], nums[oddIndex]);
            }
        }
        return nums;
    }
};

至此艺术已成,全部的数组章节已经结束了,但是今天有点不舒服,早点休息了。

感谢代码随想录,感谢各位录友!

各位一起加油!

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值