《vector的一些OJ》

这篇具有很好参考价值的文章主要介绍了《vector的一些OJ》。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文主利用我们的vector来解决一些OJ题
前三个题目很类似,分别为

  1. 一个数字只出现一次,其他数字都出现两次
  2. 两个数字只出现一次,其他数字都出现两次
  3. 一个数字只出现一次,其他数字都出现三次

1、一个只出现一次的数字,其他数字都出现两次

《vector的一些OJ》
思路:这个其实很简单,我们使用异或的思想即可。因为两个相同的数异或的结果为0,任何数和0异或都等于他本身。

class Solution {
public:
    int singleNumber(vector<int>& nums) 
    {
        int ret = 0;
        for(auto e:nums) //遍历数组,将所有数字异或
        {
            ret^=e;
        }
        return ret;
    }
};

2、两个只出现一次的数字,其他数字都出现两次

《vector的一些OJ》
思路1:我们使用排序思想。

  1. 首先将数组的数组进行排序sort()
  2. 定义一个数组ret存储要返回的这个两个数。
  3. 然后遍历数组,如果当前的数字和后一个相等,那么就跳两步,如果不行等就将这个数字放在ret里面。向后跳一步继续寻找。
    注意:这个循环的截至条件为数组元素的最后一个,为了防止越界。
  4. 出了循环判断i是否在最后一个位置,如果是,那最后一个元素也是只出现一次的。因为我们使用的是当前数字和后面一个比较的,如果不相等只会向后跳一步。
class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) 
    {
        sort(nums.begin(),nums.end());
        vector<int> ret;
        int i = 0;
        //防止越界
        for(;i < nums.size() - 1;)
        {
            if(nums[i] == nums[i+1])
            {
                i+=2;
            }
            else
            {
                ret.push_back(nums[i]);
                i+=1;
            }
        }
        
        //将最后一个元素插入
        if(i == nums.size() - 1)
        {
            ret.push_back(nums[i]);
        }
        return ret;
    }
};

思路2:使用异或思想

  1. 遍历nums,通过异或操作,得到结果 s = a ^ b(a, b为恰好只出现一次的元素)
  2. 保留s的最后为1的那位保留,其余位置设置为0 ,存入在 k 里面 (如:k = 0000 0100)
  3. knums中的每一个元素进行 & 操作,可以把nums中所有元素,划分为两组(如:一组0000 0000 , 二组:0000 0100,这样a , b 被划分到不同组中,在对每一个组进行异或,即可提取出a 和 b 了)

注意:这个赋值给k时候需要加一个判断条件。因为与运算的结果可能负数的最大值,最高位是符号位

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) 
    {
        int s = 0;
        for(int e : nums)
        {
            s ^= e;
        }

        int k = (s == INT_MIN ? s :s & (-s)); //因为s是两个单身狗^后的结果,一定有一个为1另外一个为0,使用s&(-s)可以使得这个位为1,其他位为0


        //将k与原数组进行&操作,将其分为两组,这样,两个单身狗就被分到两个组了
        vector<int> RetNums(2,0);
        for(int e : nums)
        {
            if(k & e)
            {
                RetNums[0] ^= e;
            }
            else
            {
                RetNums[1] ^= e;
            }
        }
        return RetNums;
    }
};

3、一个只出现一次的数字,其他数字都出现三次

《vector的一些OJ》

思路:这个也是用排序的思想,和上面类似,无非是条两步还是跳三步的区别

  1. 首先将数组进行排序sort()
  2. 遍历数组,将当前位置和后面一个位置进行比较,如果相等则向后跳三步,否则返回这个位置的值。

注意:这个需要再加一个判断条件,当i在最后一个位置时候也直接返回。因为每次都跳三步,都是跳到下一个不同值元素的位置。当在结尾时候,说明最后一个就是单身狗

//1:先排序
//2:然后遍历数组,如果是最后一个元素,或者当前位置的元素和后面一个不相等,那么就返回当前位置的值,否则,i+=3
//3:如果为空,则返回最后一个

class Solution {
public:
    int singleNumber(vector<int>& nums) 
    {
        sort(nums.begin(),nums.end());
       
        for(int i = 0;i < nums.size();i+=3)
        {
            if(i == nums.size() - 1 || nums[i] != nums[i+1])
            {
                return nums[i];
            }
        }
        //return nums[nums.size() - 1];
        return 0;
    }
};

4、删除数组中的重复项

《vector的一些OJ》
思路:因为是原地修改,我们使用双指针,一个用来遍历数字,一个用来修改数组

  1. 定义两个数,src=dest=0
  2. 遍历数组,如果src和dest位置的值相等就将src++,不相等我们才修改数组。(先将dest++,再将src位置的值赋值给dest位置的值。然后src++)
  3. 最后数组的长度就是dest+1
class Solution {
public:
    int removeDuplicates(vector<int>& nums) 
    {
        size_t src = 0;
        size_t dest = 0;
        for(size_t i = 0;i < nums.size();++i)
        {
            if(nums[src] == nums[dest])
            {
                ++src;
            }
            else
            {
                ++dest;
                nums[dest] = nums[src];
                ++src;
            }
        }
        return dest+1;
    }
};

5、杨辉三角

《vector的一些OJ》
思路:使用vector<vector< int >>
最外层的vector其实相当于存的是一堆数组指针,指向的是每个一维数组。里面的vector是一维数组,里面存的是数字。

《vector的一些OJ》

class Solution {
public:
    vector<vector<int>> generate(int numRows) 
    {
        //开空间初始化
        vector<vector<int>> vv;
        vv.resize(numRows,vector<int>()); //里面初始化为匿名的对象
        for(size_t i = 0;i < vv.size();++i)
        {
            vv[i].resize(i+1,0);
            vv[i][0] = 1;
            vv[i][vv[i].size() - 1] = 1;
        }

        for(size_t i = 0;i < vv.size();++i)
        {       
           //遍历每一个vector<int>赋值
            for(size_t j = 0; j < vv[i].size();++j)
            {
                if(vv[i][j] == 0)
                {
                    vv[i][j] = vv[i-1][j] + vv[i-1][j-1];
                }
            }
        }
        return vv;
    }
};

6、电话号码字母组合

《vector的一些OJ》
思路:其实就是使用多叉树深度遍历的思想。代码不难,逻辑有点麻烦

图解:
《vector的一些OJ》

//1:首先定义一个数组,数组里面每个元素数string类(每个数字对应的字符串)
//2:定义一个vector<string> vv,这个对象是一个数组,里面每个元素是一个string,最后我们将所有的组合串尾插到这个数组中

//定义一个组合函数,参数分别为  //输入的数字串,第几个数字,组合的字母串,返回的那个string类型的数组



class Solution {
public:
    //数字串
    string _numberStr[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};

    //输入的数字串,第几个数字,组合的字母串,string类型的数组
    void Combination(const string& digits,size_t di,string CombineStr,vector<string>& Strv)
    {
        if(di == digits.size())
        {
            Strv.push_back(CombineStr); //将组合串尾插数组
            return;
        }
        //1:首先取数字
        size_t num = digits[di] - '0';
        //2:找到数字对应的字串
        string str = _numberStr[num];
        //3:遍历字串,然后组合并且递归下去
        for(auto ch : str)
        {
            Combination(digits,di + 1,CombineStr + ch,Strv); //递归下一层
        }
    }

    vector<string> letterCombinations(string digits) 
    {

        vector<string> Strv; //string 类型的数组
        if(digits.size() == 0)
        {
            return Strv;
        }
        Combination(digits,0,"",Strv);
        return Strv;
    }
};

7、数组中出现次数超过一半的数字

《vector的一些OJ》

方法1:
思路:这个很简单,我们先把数组排序,然后遍历数组,当前位置和后;一个不相等就++i,相等就静茹循环计数,然后判断。

//思路:
//1:先排序
//2:然后遍历数组,这个注意要防止越界,如果前一个元素和后一个不相等,那么++i
//如果前一个和后一个相等,那么进入循环,我们来记计数。这个也要注意防止越界,结束后判断一下是不是大于长度的一般,大于就返回当前位置的值,否则将count置为1

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) 
    {
    	if(numbers.size() == 0)
    		return 0;
        //先排序
        std::sort(numbers.begin(),numbers.end());

        size_t len = numbers.size();//数组长度
        size_t i = 0;
        size_t count = 1;//相同元素个数
        while(i < len - 1) 
        {
            if(numbers[i] != numbers[i+1])
            {
                ++i;
            }
            else
            {
                while(i < len - 1 && numbers[i] == numbers[i+1])
                {
                    ++count;
                    ++i;
                }
                if(count > len/2)
                    return numbers[i];
            }
            count = 1;
        }
        return numbers[i];
    }
};

方法2:
1:先排序,题目说一定有解,那么一定是中间那个数字(因为这个数组超过了数组长度的一半)。
2:然后遍历数组,统计他的次数,最后判断一下他的次数是不是大于一般,大于则返回这个数,否则返回0。

注:其实第二部都是多余的,有解,那么就是中间这个数,直接返回就行了文章来源地址https://www.toymoban.com/news/detail-435923.html

//思路:
//1:先排序
//2:如果有解,那么一定是中间的数字

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) 
    {
        //先排序
        std::sort(numbers.begin(),numbers.end());

        //超过一般的那个数字
        int middle = numbers[numbers.size()/2];
        //这里其实直接返回就行了,因为一定会有解,那就是中间这个数字了!!
        //return numbers[numbers.size()/2]
        int count = 0;
        size_t i = 0;
        while(i < numbers.size())
        {
            if(numbers[i] = middle)
                ++count;
            ++i;
        }
        return (count > numbers.size()/2) ? middle : numbers[0];    
    }
};

到了这里,关于《vector的一些OJ》的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 我们在SqlSugar开发框架中,用到的一些设计模式

    我们在《SqlSugar开发框架》中,有时候都会根据一些需要引入一些设计模式,主要的目的是为了解决问题提供便利和代码重用等目的。而不是为用而用,我们的目的是解决问题,并在一定的场景下以水到渠成的方式处理。不过引入任何的设计模式,都会增加一定的学习难度,

    2024年02月21日
    浏览(42)
  • Win11新建不了文本文档?Win11右键无法新建文本文档的解决方法

    ​Win11系统具有稳定、速度快、系统干净等特点,深受用户的喜爱,但是在使用中难免会出现一些问题,就比如右键无法新建文本文档的情况,出现这一情况的原因很有可能是由于系统文件缺失问题,对此我们一起来看看小编是如何解决的吧。 还有详细的一键重装系统方法

    2024年02月08日
    浏览(66)
  • 【周末闲谈】如何利用AIGC为我们创造有利价值?

    个人主页:【😊个人主页】 系列专栏:【❤️周末闲谈】 ✨第一周 二进制VS三进制 ✨第二周 文心一言,模仿还是超越? ✨第二周 畅想AR 在此之前,我写过一篇关于AIGC的介绍文,我们了解到AIGC的诞生给我们的生活带来了多么巨大的改变。那么我们应该怎样利用它为我们创

    2024年02月09日
    浏览(43)
  • 右键新建没有TXT文本文档的解决办法

    案例:Windows11 家庭中文版桌面右键新建没有TXT文本文档 Windows键/开始–设置–应用–可选功能–添加可选功能–记事本打钩–安装; 如果没有记事本,那可能已经安装了记事本,可以参考第2步,直接修改注册表。 一般都会默认安装的,都可以直接跳到第2步。 Windows Registr

    2024年02月14日
    浏览(44)
  • Unity 3D之 利用Vector3 计算移动方向,以及实现位移多少

    这段代码是一个在游戏开发中常见的示例,用于获取玩家的输入,并将输入值转换为一个三维向量,以表示移动方向。让我们逐步解释这段代码: float horizontalInput = Input.GetAxis(\\\"Horizontal\\\"); :这一行代码获取水平方向上的输入。它调用 Input.GetAxis(\\\"Horizontal\\\") 来获取水平轴的输入

    2024年02月11日
    浏览(41)
  • Google I/O 2023 大会上发布了一些令人兴奋的技术和产品,让我们一起来看看吧!

    Google I/O 2023 大会上发布了一些令人兴奋的技术和产品,让我们一起来看看吧! Google I/O 2023 的日期和地点 Google I/O 2023 于 5 月 10 日在美国加州山景城的海岸线圆形剧场举行12。这是 Google 每年举办的开发者大会,旨在展示 Google 的最新解决方案、产品和技术。今年的大会有限制

    2024年02月04日
    浏览(54)
  • 利用Chat GPT建立一个To-Do应用程序--我们终于遇到了我们的替代者吗?

    海外Udemy、Coursera、Skillshare、Cantrill等平台精品编码课程,请访问 https://www.postcode.vip 我们看到GitHub Copilot在2021年10月发布,整个开发社区都疯了。 有些人声称我们很快就会失去工作,而其他人,像我一样,认为虽然这个工具很有趣,但它离替代品还很远。它可以提供更好的自

    2023年04月23日
    浏览(45)
  • 利用Lambda表达式实现vector中pair/结构体的排序

    众所周知,对于 vectorpairint, int 若直接使用 sort 排序,会默认按照 pair 的 第一个 从小到大 进行排序: 其输出结果为: 若想要更改其排序规则,可以考虑使用自定义 cmp 函数并添加在 sort 的第三个参数位置, 但使用 L a m b d a rm Lambda Lambda 表达式则更为简单。如下代码

    2024年01月17日
    浏览(36)
  • Xshell连接不上排错以及解决方案(本文原因:重启网卡失败)

    目录 ​说一下我自己的排错思路: (1)检查自己想要链接的虚拟机有无开启 (2)检查windows服务里面关于虚拟机和xshell的服务是否已经开启,网络是否出错 (3)进入ens33文件查看ip ,dns1等是否出现配置错误 (4)检查防火墙有没有关闭 (5)查看ssh服务是否开启  (6)是否

    2024年02月04日
    浏览(44)
  • 高维向量搜索:在 Elasticsearch 8.X 中利用 dense_vector 的实战探索

    近年来,随着深度学习技术的发展,向量搜索引发了人们的广泛关注。早在 Elasticsearch在7.2.0 版本引入了dense_vector字段类型,支持存储高维向量数据,如词嵌入或文档嵌入,以进行相似度搜索等操作。在本文中,我将展示如何在Elasticsearch 8.X 版本中使用 dense_vector 进行向量搜索

    2024年02月15日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包