【C++刷题】经典简单题第一辑

news2025/1/17 16:02:38
  1. 数字在升序数组中出现的次数
    在这里插入图片描述
class Solution
{
public:
    int GetNumberOfK(vector<int>& nums, int k)
    {
        size_t left = 0;
        size_t right = nums.size();
        size_t mid1 = -1;
		
		/*
		* 用二分法的思想寻找 k 的边界
		*/
		
		// 寻找 k 的左边界下标
        while(left < right)
        {
            mid1 = left + (right - left) / 2;
            if(nums[mid1] > k)
            {
                right = mid1;
            }
            else if(nums[mid1] < k)
            {
                left = mid1 + 1;
            }
            else
            {
            	// mid1 == left 防止越界访问
                if(mid1 == left || nums[mid1 - 1] != k)
                {
                    break;
                }
                else
                {
                    right = mid1;
                }
            }
        }
		
		// 说明 k 不存在
        if(left  >= right)
        {
            return 0;
        }

        left = 0;
        right = nums.size();
        size_t mid2 = -1;
        while(left < right)
        {
            mid2 = left + (right - left) / 2;
            if(nums[mid2] > k)
            {
                right = mid2;
            }
            else if(nums[mid2] < k)
            {
                left = mid2 + 1;
            }
            else
            {
                if(mid2 == right ||nums[mid2 + 1] != k)
                {
                    break;
                }
                else
                {
                    left = mid2 + 1;
                }
            }
        }

        return mid2 - mid1 + 1;
    }
};
  1. 整数转换
    在这里插入图片描述
class Solution 
{
public:
    int convertInteger(int A, int B) 
    {
    	// ^异或 相同为0,相异为1
        int C = A ^ B;
        int ret = 0;
        for(size_t i = 0; i < 32; ++i)
        {
        	// 有多少个1,就有多少位不同
            if(C & (1 << i))
            {
                ++ret;
            }
        }
        return ret;
    }
};
  1. 至少是其他数字两倍的最大数
    在这里插入图片描述
class Solution 
{
public:
    int dominantIndex(vector<int>& nums) 
    {
        if(nums.size() < 2)
        {
            return 0;
        }
		
		// max 记录最大
		// sec 记录次大
        int ret = 0;
        int max = nums[0];
        int sec = nums[1];
        if(sec > max)
        {
            swap(sec, max);
            ret = 1;
        }

        for(size_t i = 2; i < nums.size(); ++i)
        {
            if(nums[i] > max)
            {
                sec = max;
                max = nums[i];
                ret = i;
            }
            else if(nums[i] > sec)
            {
                sec = nums[i];
            }
        }

        if(max >= 2 * sec)
        {
            return ret;
        }
        
        return -1;
    }
};
  1. 寻找数组的中心下标
    在这里插入图片描述
class Solution 
{
public:
    int pivotIndex(vector<int>& nums) 
    {
        int total = 0;
        for(int n : nums)
        {
            total += n;
        }

        int sum = 0;
        for(size_t i = 0; i < nums.size(); ++i)
        {
        	// 假设 i 是中心下标, sum 是一边的和
            if(2 * sum + nums[i] == total)
            {
                return i;
            }
            sum += nums[i];
        }
        return -1;
    }
};
  1. 多数元素
    在这里插入图片描述
// 投票算法
class A
{
public:
    int _val;
    int _count = 0;
};

class Solution 
{
public:
    int majorityElement(vector<int>& nums) 
    {
        A a;
        for(int n : nums)
        {
            if(a._count == 0)
            {
                a._val = n;
                a._count = 1;
            }
            else if(n == a._val)
            {
                ++a._count;
            }
            else
            {
                --a._count;
            }
        }
        return a._val;
    }
};
  1. 除自身以外数组的乘积
    在这里插入图片描述
class Solution 
{
public:
    vector<int> productExceptSelf(vector<int>& nums) 
    {
        vector<int> v;
        v.resize(nums.size());
        v[0] = 1;
        // 将累乘分两次进行
        // 第一次将每个位置的前缀元素累乘放进数组中
        for(size_t i = 1; i < nums.size(); ++i)
        {
            v[i] = v[i-1] * nums[i-1];
        }
		
		// 第二次将每个位置的后缀元素累乘 与数组中对应位置的前缀积相乘 放进数组中
        int result = 1;
        for(size_t i = nums.size() - 2; i != -1; --i)
        {
            result *= nums[i+1];
            v[i] *= result;
        }

        return v;
    }
};
  1. 不用加减乘除做加法
    在这里插入图片描述
class Solution 
{
public:
    int Add(int num1, int num2) 
    {
    	// num1 保存不进位的数据
    	// num2 保存进位的数据
        while(num2)
        {
            int tmp = num1 ^ num2;
            num2 = (num1 & num2) << 1;
            num1 = tmp;
        }

        return num1;
    }
};
  1. 找到所有数组中消失的数字
    在这里插入图片描述
class Solution
{
public:
    vector<int> findDisappearedNumbers(vector<int>& nums)
    {
        vector<int> v;
        size_t n = nums.size();
        // 数据存在,将相应下标位置的数据+=n
        for (size_t i = 0; i < n; ++i)
        {
            nums[(nums[i] - 1) % n] += n;
        }
		
		// 只要数据不大于n,其相应的下标就是消失的数字
        for (size_t i = 0; i < n; ++i)
        {
            if (nums[i] <= n)
            {
                v.push_back(i + 1);
            }
        }

        return v;
    }
};
  1. 单词倒排
    在这里插入图片描述
#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int main() 
{
    string s;
    getline(cin, s);

    int i = s.size() - 1;
    int start = 0;
    int end = 0;
    while(i >= 0)
    {
    	// 逆序遍历,遇到单词就记录单词起始下标[start, end]
        if(isalpha(s[i]))
        {
            end = i;
        }
        while(i >= 0 && isalpha(s[i]))
        {
            --i;
        }
        start = i + 1;
        for(int j = start; j <= end; ++j)
        {
            cout << s[j];
        }
        // 单词之后紧跟空格
        while(i >= 0 && !isalpha(s[i]))
        {
            --i;
        }
        cout << " ";
    }
}
  1. 珠玑妙算
    在这里插入图片描述
class Solution 
{
// 四种颜色的枚举
enum
{
    BLUE,
    GREEN,
    RED,
    YELLOW
};
public:
    vector<int> masterMind(string solution, string guess) 
    {
        vector<int> v = {0, 0}; 
        vector<int> vs = {0,0,0,0};
        vector<int> vg = {0,0,0,0};
        
        for(int i = 0; i < 4; ++i)
        {
            if(guess[i] == solution[i])
            {
            	// "猜中"
                ++v[0];
            }
            else // 伪猜中“”
            {
                switch (guess[i])
                {
                    case 'B':
                        ++vg[BLUE];
                        break;
                    case 'G':
                        ++vg[GREEN];
                        break;
                    case 'R':
                        ++vg[RED];
                        break;
                    case 'Y':
                        ++vg[YELLOW];
                        break;
                    default:
                        break;
                }

                switch (solution[i])
                {
                    case 'B':
                        ++vs[BLUE];
                        break;
                    case 'G':
                        ++vs[GREEN];
                        break;
                    case 'R':
                        ++vs[RED];
                        break;
                    case 'Y':
                        ++vs[YELLOW];
                        break;
                    default:
                        break;
                }
            }
        }

        for(int i = 0; i < 4; ++i)
        {
        	// 各个颜色“伪猜中”的次数相加
            v[1] += (vs[i] < vg[i] ? vs[i] : vg[i]);
        }

        return v;
    }
};
  1. 寻找峰值
    在这里插入图片描述
    在这里插入图片描述
class Solution 
{
public:
    int findPeakElement(vector<int>& nums)
    {
        int left = 0;
        int right = nums.size() - 1;
        // 对首尾元素进行排查
        if(nums.size() == 1 || nums[left] > nums[left + 1])
        {
            return 0;
        }
        if(nums[right] > nums[right - 1])
        {
            return right;
        }
		
		// 因为是任意一个峰值元素,可以用二分法
        int mid = 0;
        while(left < right)
        {
            mid = left + (right - left) / 2;
            if(nums[mid] < nums[mid + 1])
            {
                left = mid + 1;
            }
            else
            {
                right = mid;
            }
        }
        return left;
    }
};
  1. 数对
    在这里插入图片描述
int main() 
{
    long long n, k;
    cin >> n >> k;
    if(k == 0)
    {
        printf("%lld", n*n);
        return 0;
    }

    long long count = 0;
    for(long long y = k + 1; y <= n; ++y)
    {
        count += (n / y) * (y - k) + ((n % y < k) ? 0 : (n % y - k + 1));
    }

    printf("%lld", count);
    return 0;
}

解析:
由于需要满足条件x % y >= k,所以y的取值范围必须是[k+1, n](如果y <= kx % y的结果一定在会小于k)。
所以可以通过对y的每一个取值,来统计满足x % y >= k条件的x的个数。
对于每一个特定的y值,x的取值区间都在[1, n]
可以根据y的大小为单位,对x的取值划分区间如下:
在这里插入图片描述
一个可以划分t = n / y个完整的区间,每个区间满足条件x % y >= kx值有y - k个,所以t个区间一共有(n / y) * (y - k)个。
最后剩余一个不完整的区间的个数是n % y,如果n % y < k,那么剩余区间里x % y >= k的个数为0,否则个数为n % y - k + 1个。
上面的计算前提是k != 0,如果k == 0,直接返回n * n

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/829509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

yolov3-spp 训练结果分析:网络结果可解释性、漏检误检分析

1. valid漏检误检分析 ①为了探查第二层反向找出来的目标特征在最后一层detector上的意义&#xff01;——为什么最后依然可以框出来目标&#xff0c;且mAP还不错的&#xff1f; ②如何进一步提升和改进这个数据的效果&#xff1f;可以有哪些优化数据和改进的地方&#xff1f;让…

5分钟学会你创建搜狗百科

搜狗百科属于微信生态里的平台&#xff0c;搜狗百科不仅在搜狗搜索中展示&#xff0c;且可以在微信搜索中展示。那么搜狗百科该怎么创建呢&#xff1f;下面小马识途营销顾问分享下搜狗百科词条创建的流程。 1、要创建搜狗百科词条&#xff0c;首先需要在搜狗百科官网上注册一个…

【前端入门之旅】HTML中元素和标签有什么区别?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 标签&#xff08;Tag&#xff09;⭐元素&#xff08;Element&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…

实例028 为触摸屏程序添加虚拟键盘

实例说明 由于触摸屏没有键盘&#xff0c;只能利用屏幕操作。如果要输入数据或查找数据&#xff0c;需要制作一个虚拟键盘&#xff0c;以方便用户输入。本例介绍如何实现虚拟键盘的程序设计。运行本例&#xff0c;效果如图1.28所示。 技术要点 本例中用到了Lable控件的透明属…

【HarmonyOS】性能优化之低代码开发加载多张轮播图

【关键字】 HarmonyOS、低代码开发、Swiper组件、性能优化、分页加载 写在前面 目前使用DevEco Studio的低代码工具开发元服务时&#xff0c;通过实际测试发现&#xff0c;Swiper组件加载多张轮播图时加载显示耗时较长&#xff08;实际测试网络状态一般的情况下显示耗时达到8…

好的CRM有哪些优点及功能?

市面上有很多CRM品牌&#xff0c;很多初次选型的企业没有深入的了解&#xff0c;不知道如何选择适合自己的CRM软件。小编认为&#xff0c;CRM选型无非就是靠谱和适合。这里有一款值得信赖的CRM软件推荐——Zoho CRM。 一、什么是Zoho CRM&#xff1f; Zoho CRM是一款SaaS云端…

只需十四步,从零开始掌握Python机器学习

推荐阅读&#xff08;点击标题查看&#xff09; 1、Python 数据挖掘与机器学习实践技术应用 2、R-Meta分析与【文献计量分析、贝叶斯、机器学习等】多技术融合实践与拓展 3、最新基于MATLAB 2023a的机器学习、深度学习 4、【八天】“全面助力AI科研、教学与实践技能”夏令营…

计算机视觉与图形学-神经渲染专题-第一个基于NeRF的自动驾驶仿真平台

如今&#xff0c;自动驾驶汽车可以在普通情况下平稳行驶&#xff0c;人们普遍认识到&#xff0c;真实的传感器模拟将在通过模拟解决剩余的极端情况方面发挥关键作用。为此&#xff0c;我们提出了一种基于神经辐射场&#xff08;NeRF&#xff09;的自动驾驶模拟器。与现有作品相…

无人机自动返航的关键技术有哪些

无人机的广泛应用使得无人机自动返航技术变得至关重要。在各种应对意外情况的背景下&#xff0c;无人机自动返航技术的发展对确保无人机的安全&#xff0c;以及提高其应用范围具有重要意义。接下来&#xff0c;便为大家详细介绍无人机自动返航所运用到的关键技术。 一、定位与导…

Mysql on duplicate key update用法及优缺点

在实际应用中&#xff0c;经常碰到导入数据的功能&#xff0c;当导入的数据不存在时则进行添加&#xff0c;有修改时则进行更新&#xff0c; 在刚碰到的时候&#xff0c;一般思路是将其实现分为两块&#xff0c;分别是判断增加&#xff0c;判断更新&#xff0c;后来发现在mysql…

服务器的shell脚本

shell脚本语句可以执行linux的操作语句。 linux相当于网页&#xff0c;shell相当于java。可以解释编写执行逻辑。 shell的开头以&#xff1a;#!bin/sh 定义解析方式&#xff0c;不同的linuxe内核解释方式不同。大多数内核支持sh&#xff08;bash&#xff09;方式。 执行sh文件可…

C# Onnx Paddle模型 OCR识别

RapidOCR https://github.com/RapidAI/RapidOCR/blob/main/docs/README_zh.md 效果 项目 Demo&#xff08;带模型&#xff09;下载

spring-cache框架使用笔记

spring-cache框架使用笔记 什么是spring-cache框架 spring-cache是spring框架中的一个缓存抽象层&#xff0c; 它提供了一种简便的方式来集成不同的底层缓存实现&#xff0c; 如内存缓存(concurrentMap/ehcache/caffeine)/分布式缓存(redis/couchbase)等 它简化了在app中使用…

网络安全进阶学习第十课——MySQL手工注入

文章目录 一、MYSQL数据库常用函数二、MYSQL默认的4个系统数据库以及重点库和表三、判断数据库类型四、联合查询注入1、具体步骤&#xff08;靶场演示&#xff09;&#xff1a;1&#xff09;首先判断注入点2&#xff09;判断是数字型还是字符型3&#xff09;要判断注入点的列数…

O3DE的Pass

Pass介绍 Pass是具有输入和输出的渲染过程。 在最终渲染帧中看到的每个细节都是通过一系列Pass&#xff08;前一个Pass的输出是下一个Pass的输入&#xff09;计算出来的。Pass可以生成图像&#xff08;作为纹理、缓冲区或渲染目标&#xff09;。每个图像都包含关于场景的特定…

【话题】感觉和身边其他人有差距怎么办?也许自我调整很重要

每个人能力有限&#xff0c;水平高低不同&#xff0c;我们身在大环境里&#xff0c;虽然在同一个起跑线上&#xff0c;但是时间久了&#xff0c;你会发现&#xff0c;并越来越感觉到和身边其他人有了差距&#xff0c;慢慢的会有一定的落差感&#xff0c;怎么办呢&#xff01;通…

Android手机信息获取(详细版)

经典好文推荐,通过阅读本文,您将收获以下知识点: 一、 获取手机基本信息(厂商、型号等参数) 二、设备信息获取实现图 三、 获取手机设备 宽、高、IMEI 信息 四、 获取手机厂商名、产品名、手机品牌、手机型号、主板名、设备名 五、获取手机硬件名、SDK版本、android版本 、语…

无代码开发:打破传统开发模式,引领数字化转型新方向

随着数字化转型的加速&#xff0c;企业对于高效、便捷的软件开发需求愈发旺盛。无代码开发作为一种新兴的软件开发模式&#xff0c;以其可视化、模块化的开发方式&#xff0c;为数字化转型提供了新的方向。本文将从无代码开发的优势、应用场景、如何实现等方面进行详细解读&…

中介者模式——协调多个对象之间的交互

1、简介 1.1、概述 如果在一个系统中对象之间的联系呈现为网状结构&#xff0c;如下图所示&#xff1a; 对象之间存在大量的多对多联系&#xff0c;将导致系统非常复杂&#xff0c;这些对象既会影响别的对象&#xff0c;也会被别的对象所影响&#xff0c;这些对象称为同事对…