数组水题合集——LeetCode题海实战汇总

目录

LeetCode1295.统计位数为偶数的数字

LeetCode1252.奇数值单元格的数组

LeetCode1304.和为零的N个唯一整数

LeetCode1299.将每个元素替换为右侧最大元素

LeetCode26.删除排序数组中的重复项

LeetCode面试题16.01.交换数字

LeetCode1313.解压缩编码列表

LeetCode1351.统计有序矩阵中的负数

LeetCode面试题01.07.旋转矩阵


LeetCode1295.统计位数为偶数的数字

常规解法,一分钟没AC就算不合格吧

class Solution {
public:
    int findNumbers(vector<int>& nums) {
        int sum = 0;
        for(int i=0;i<nums.size();i++){
            int n = 0;
            while(nums[i]>0){
                nums[i]/=10;
                n++;
            }
            if(n%2==0)
                sum++;
        }
        return sum;
    }
};

强制类型转换,用to_string转换成string类型再判断!

class Solution {
public:
    int findNumbers(vector<int>& nums) {
        int sum = 0;
        for(int i=0;i<nums.size();i++){
            string tmp = to_string(nums[i]);
            if(tmp.size()%2==0)
                sum++;
        }
        return sum;
    }
};

LeetCode1252.奇数值单元格的数组

记得不是全局变量的话要自己手动赋值为零,简单模拟即可,水题

class Solution {
public:
    int oddCells(int n, int m, vector<vector<int>>& indices) {
        int a[n][m];
        //必须要这样赋值0
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                a[i][j] = 0;
        for(int i=0;i<indices.size();i++){
            for(int k=0;k<m;k++){
                a[indices[i][0]][k]++;
            }
            for(int l=0;l<n;l++){
                a[l][indices[i][1]]++;
            }
        }
        int num=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(a[i][j]%2!=0)
                    num++;
        return num;
    }
};

LeetCode1304.和为零的N个唯一整数

 

中奖……当然其他的解法有很多,自行DIY

class Solution {
public:
    vector<int> sumZero(int n) {
        vector<int> v;
        if(n%2==0)
            for(int i=-n/2;i<=n/2;i++){
                if(i!=0)
                    v.push_back(i);
            }
        else{
            for(int i=-n/2;i<=n/2;i++){
                v.push_back(i);
            }
        }
        return v;
    }
};

LeetCode1299.将每个元素替换为右侧最大元素

先一顿瞎暴力,瞎几把乱搞一通AC就对了哈哈

class Solution {
public:
    vector<int> replaceElements(vector<int>& arr) {
        //先瞎暴力AC再说
        int i;
        for(i=0;i<arr.size()-1;i++){
            int maxnum = -(1<<21);
            for(int j=i+1;j<arr.size();j++){
                maxnum = arr[j]>maxnum?arr[j]:maxnum;
            }
            arr[i] = maxnum;
        }
        arr[i] = -1;
        return arr;
    }
};

其实改进的方法是每次最大位置不用重复查找,记录其下标就行;

可以将复杂度降低,从O(n^n)降为O(n)

LeetCode26.删除排序数组中的重复项

讨巧写法:利用set自动去重的特性(不推荐)

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        set<int> s(nums.begin(),nums.end());
        int i=0;
        for(set<int>::iterator it = s.begin();it!=s.end();it++){
            nums[i++] = *it;
        }
        return s.size();
    }
};

 dalao写法,我是想不来;

解释一下,答案会对数组自动切片去前n个数,所以直接赋值不管后面的数是怎样就好

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if(nums.size()<2)
            return nums.size();
        int i = 0;
        int size = nums.size();
        for(int j = 1;j<size;j++){
            if(nums[j]!=nums[i])
                nums[++i] = nums[j];
        }
        return ++i;
    }
};

LeetCode面试题16.01.交换数字

这题真是佛,我只能说这骚操作666

我佛了

class Solution {
public:
    vector<int> swapNumbers(vector<int>& numbers) {
        if(numbers[0]>0 && numbers[1]>0 || numbers[0]<0 && numbers[1]<0){
            numbers[0]=-numbers[0];
            numbers[0]=numbers[0]+numbers[1];
            numbers[1]=numbers[1]-numbers[0];
            numbers[0]=numbers[0]+numbers[1];
        }else{
            numbers[0]=numbers[0]+numbers[1];
            numbers[1]=numbers[0]-numbers[1];
            numbers[0]=numbers[0]-numbers[1];
        }
        return numbers;
    }
};

LeetCode1313.解压缩编码列表

水题……这都能中奖,佛了

class Solution {
public:
    vector<int> decompressRLElist(vector<int>& nums) {
        vector<int> v;
        for(int i=0;i<nums.size();i+=2)
            for(int j = 0;j<nums[i];j++)
                v.push_back(nums[i+1]);
        return v;
    }
};

LeetCode1351.统计有序矩阵中的负数

明显是二分,但是我二分还没有开始刷,不管,先花30秒A一遍再说

今天因为出去钓鱼耽误了刷链表的进度,还是这两天尽快把链表刷熟练了,开始二分!

class Solution {
public:
    int countNegatives(vector<vector<int>>& grid) {
        int sum = 0;
        for(int i=0;i<grid.size();i++)
            for(int j = 0;j<grid[i].size();j++)
                if(grid[i][j]<0)
                    sum++;
        return sum;
    }
};

LeetCode面试题01.07.旋转矩阵

这题略显无聊……

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        if(matrix.size()==0||matrix.size()!=matrix[0].size())
            return;
        int n = matrix.size();
        for(int layer = 0;layer<n/2;layer++){
            int first = layer;
            int last = n-1-layer;
            for(int i=first;i<last;i++){
                int offset = i-first;
                int top = matrix[first][i];//存储上边
                //左边移动到上边
                matrix[first][i] = matrix[last-offset][first];
                //下边移动到左边
                matrix[last-offset][first] = matrix[last][last-offset];
                //右边移动到下边
                matrix[last][last-offset] = matrix[i][last];
                //上边移动到右边
                matrix[i][last] = top;
            }
        }
        return;
    }
};
发布了377 篇原创文章 · 获赞 344 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/qq_41895747/article/details/104868722