c++:vector的相关oj题(136. 只出现一次的数字、118. 杨辉三角、26. 删除有序数组中的重复项、JZ39 数组中出现次数超过一半的数字)

2024-02-27 1996阅读

温馨提示:这篇文章已超过387天没有更新,请注意相关的内容是否还可用!

文章目录

  • 1. 136. 只出现一次的数字
    • 题目详情
    • 代码(直接来异或)
    • 思路
    • 2. 118. 杨辉三角
      • 题目详情
      • 代码1
      • 思路
      • 代码2
      • 思路2
      • 3. 26. 删除有序数组中的重复项
        • 题目详情
        • 代码
        • 思路
        • 4. JZ39 数组中出现次数超过一半的数字
          • 题目详情
          • 代码1(暴力)
          • 思路1
          • 代码2(Boyer-Moore 投票算法)
          • 思路2

            1. 136. 只出现一次的数字

            传送门

            题目详情

            c++:vector的相关oj题(136. 只出现一次的数字、118. 杨辉三角、26. 删除有序数组中的重复项、JZ39 数组中出现次数超过一半的数字)

            代码(直接来异或)

            class Solution {
            public:
                int singleNumber(vector& nums) {
                    //根据:某个元素只出现一次   直接来异或
                    int ret=0;
                    for(auto e:nums)
                    {
                        ret=ret^e;
                    }
                    return ret;
                }
            };
            

            思路

            1. 异或运算的性质:异或运算(^)具有以下性质**(相同为0,相异为1)**
              • 任何数和0做异或运算,结果仍然是原来的数:a ^ 0 = a
              • 任何数和自身做异或运算,结果为0:a ^ a = 0
              • 异或运算满足交换律和结合律:a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b
              • 利用异或运算的性质:如果一个数出现两次,那么两次出现的数异或后结果为0;如果一个数只出现一次,那么异或后结果为该数本身。
              • 利用上述性质,遍历nums中的所有元素,并进行异或运算,最终得到的结果就是只出现一次的元素。

                c++:vector的相关oj题(136. 只出现一次的数字、118. 杨辉三角、26. 删除有序数组中的重复项、JZ39 数组中出现次数超过一半的数字)

            2. 118. 杨辉三角

            传送门

            题目详情

            c++:vector的相关oj题(136. 只出现一次的数字、118. 杨辉三角、26. 删除有序数组中的重复项、JZ39 数组中出现次数超过一半的数字)

            代码1

            class Solution {
            public:
                vector generate(int numRows) {
                    vector vv;
                    vv.resize(numRows);//先给好numRows个元素,即vv里能存vector
                    for(int i=0;i
                        vv[i].resize(i+1);//每一行里再开好对应的大小
                        vv[i].front()=vv[i].back()=1;//最左最右都是1
                    }
                    for(int i=2;i
                         for(int j=1;j
                             vv[i][j]=vv[i-1][j-1]+vv[i-1][j];
                         }
                     }
                    return vv;
                }
            };
            
            public:
                vector
                    vector
                        vv[i].resize(i+1,0);//每一行里再开好对应的大小
                        vv[i].front()=vv[i].back()=1;//最左最右都是1
                    }
                    for(int i=0;i
                        for(int j=0;j
                            if(vv[i][j]==0)
                            vv[i][j]=vv[i-1][j-1]+vv[i-1][j];
                        }
                    }
                    return vv;
                }
            };
            
            public:
                int removeDuplicates(vector
                    if(nums.size()==0)//处理0的情况
                    {
                        return 0;
                    }
                    int index=1;
                    int pre_index=0;
                    while(index
                        if(nums[index]!=nums[pre_index])
                        {
                            nums[pre_index+1]=nums[index];//赋值给下一个后加一,就是新位置了,再用后面的来比
                            pre_index++;
                        }
                        index++;
                    }
                    return pre_index+1;//下标加1才是元素个数
                }
            };
            
                    // write code here
                    int half=numbers.size()/2;
                    for(int i=0;i
                        int count=0;
                        for(int j=i+1;j
                            if(numbers[i]==numbers[j])
                            {
                                count++;
                            }
                            if(count=half)
                            {
                                return numbers[i];
                            }
                        }
                    }
                    return numbers[0];
                }
            };
            
                    // write code here
                    int count = 0;
                    int candidate=numbers[0];//一开始就假设第一个是候选者
                    for (auto num : numbers) {
                        if (count == 0) {
                            candidate = num;
                        }
                        count += (num == candidate) ? 1 : -1;//相等就+1,不等-1
                    }
                    return candidate;
                }
            };
            
VPS购买请点击我

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

目录[+]