首页 > 编程语言 >C++ 习题精选(1)

C++ 习题精选(1)

时间:2024-05-31 21:29:06浏览次数:17  
标签:字符 num1 num2 int C++ 精选 add 字符串 习题

这里写目录标题

1. 字符串相加

题目描述:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

示例 1:
输入:num1 = “11”, num2 = “123”
输出:“134”
示例 2:
输入:num1 = “456”, num2 = “77”
输出:“533”
示例 3:
输入:num1 = “0”, num2 = “0”
输出:“0”

提示:
1 <= num1.length, num2.length <= 104
num1 和num2 都只包含数字 0-9
num1 和num2 都不包含任何前导零

题目链接: https://leetcode.cn/problems/add-strings/submissions/536307291?clienttype=8&version=7.40.0.113&from=win32_yunguanjia&channel=00000000000000000000000040000001&privilege=&pri_extra=

解题思路:
我们想象一下,如果是两个数相加,怎么计算?从个位开始,每位相加,逢十进一。那么字符串也可以按照这样来进行计算,字符也是整形,在ASCII码中数字字符是连续的,所以减去字符零(‘0’)就是对应的数字。下述代码通过两个下标(i和j)分别指向两个字符串的末尾位,然后add变量存储进位值,通过条件运算符来判断该字符串是否结束,结束值为0,每次计算相加本位的两个数字(i和j)和进位值add,把结果接在空字符串ret的末尾,然后下一组。所以只有当两个下标均为-1且进位值为0时,才结束循环。由于是逆序存储,所以要对结果再次逆序操作,使其正序。(讲的不是很好,读者能理解就行,不能理解看看他人的讲解)

代码如下:

// 反转字符串
void reverse(string& s)
{
    int i = 0, j = s.size() - 1;  // 开始和结尾
    while (i < j)
    {
        // 交换
        char tmp = s[j];
        s[j] = s[i];
        s[i] = tmp;
        // 下一组
        ++i;
        --j;
    }
}

class Solution {
public:
    string addStrings(string num1, string num2) {
        
        // 和加法一样,每位相加
        int i = num1.size() - 1, j = num2.size() - 1;  // 下标,最后一位
        string ret("");  // 存储相加的结果
        int add = 0;  // 上一位是否有进位
        while (i >= 0 || j >= 0 || add > 0)
        {
            // 两数本位取值
            int n1, n2;
            n1 = (i >= 0 ? num1[i] - '0' : 0);
            n2 = (j >= 0 ? num2[j] - '0' : 0);
            // 本位相加结果
            int result = n1 + n2 + add;
            // 存储本位和进位
            ret += (result % 10 + '0');  // 这里不用强转,char类型进行算数运算都会转换为int类型
            add = result / 10;
            // 下一位
            --i;
            --j;
        }
        // 反转结果字符串
        reverse(ret);
        return ret;
    }
};

2. 字符串中的第一个唯一字符

题目描述:给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。

示例 1:

输入: s = “leetcode”
输出: 0
示例 2:

输入: s = “loveleetcode”
输出: 2
示例 3:

输入: s = “aabb”
输出: -1

提示:
1 <= s.length <= 105
s 只包含小写字母

题目链接: https://leetcode.cn/problems/first-unique-character-in-a-string/description/?clienttype=8&version=7.40.0.113&from=win32_yunguanjia&channel=00000000000000000000000040000001&privilege=&pri_extra=

解题思路:
可以看到提示只有26个英文字母,那我们可以是用统计算法。创建一个大小为26的int数组,遍历一遍字符串存储每个字符出现的次数,然后再次遍历字符串,找出第一个唯一字符。可以通过让字符减去字符’a’得到字符在字符数组中的位置。

代码如下:

class Solution {
public:
    int firstUniqChar(string s) {
        // 存储26个小写字母出现的次数
        int times[26] = { 0 };
        // 遍历字符串存储字符的出现次数
        int size = s.size();
        for (int i = 0; i < size; ++i)
        {
            int n = s[i] - 'a';
            ++times[n];
        }
        // 找出第一个出现一次的字符
        int key = -1;
        for (int i = 0; i < size; ++i)
        {
            int n = s[i] - 'a';
            if (times[n] == 1)
            {
                key = i;
                break;
            }
        }
        // 输出
        return key;
    }
};

标签:字符,num1,num2,int,C++,精选,add,字符串,习题
From: https://blog.csdn.net/weixin_70742989/article/details/139361301

相关文章

  • C++学习: 输入与输出
    一、输出使用cout函数,用<<分隔。注:需要头文件#include<iostream>,所有符号都为英文。例:#include<iostream>intmain(){cout<<"hello!"<<endl;//endl或'\n'换行return0;}输出结果:hello!endl就是endline(换行)的意思。二、输入一、普通输入......
  • 系统编程练习题----利用条件量和互斥锁,实现两个线程之间的同步与互斥
    目录题目解析代码结果展示题目解析​ 该题主要依靠条件量和互斥锁来实现线程之间的同步与互斥,分析主线程、线程A和线程B的任务如下:主线程:打开LCD屏和触摸屏的硬件文件,并分别存储两个文件的文件描述符,方便后面进行条件判断。开启线程A和线程B。定义并初始化条件量和互斥......
  • java期末练习题,设计一个学生类,包括公开的学号、私有的成绩及其题目所要求的条件进行打
    (1)Student类中包含公开的学号、私有的成绩两个属性;(2)分别给这两个属性分别定义设置值与获取值的方法;1)在学号设置方法中,如果学号长度大于12位,提示用户并截取前12位。2)在分数设置方法中,如果分数不在0-100范围内,提示用户并默认60分。(3)Student类中定义一个无参的......
  • java期末练习题,设计教师类,完成教授,副教授,讲师三个类的定义,在完成相应的测试。
        教授的基本工资为5000元,每学时补贴70元;     副教授的基本工资为3500元,每学时补贴60元;     讲师的基本工资2600元,每学时补贴55元。     已知每个教师的学时数,计算每个教师的每月工资数。输入1对应教授。输入2对应副教......
  • c/c++设计模式--组合模式
      namespace_nmsp1{//文件相关类classFile{public://构造函数File(stringname):m_sname(name){}//显示文件名voidShowName(stringlvlstr)//lvlstr:为了显示层次关系的缩进字符串内容{......
  • L2-043 龙龙送外卖(C++, 记忆化搜索)
    龙龙是“饱了呀”外卖软件的注册骑手,负责送帕特小区的外卖。帕特小区的构造非常特别,都是双向道路且没有构成环——你可以简单地认为小区的路构成了一棵树,根结点是外卖站,树上的结点就是要送餐的地址。每到中午12点,帕特小区就进入了点餐高峰。一开始,只有一两个地方点外卖,龙......
  • c++正则表达式汇总
    个人遇到的坑:使用''时需要携程'\'转译符号,否则匹配不正常正则表达式Regex(regularexpression)是一种强大的描述字符序列的工具。在许多语言中都存在着正则表达式,C++11中也将正则表达式纳入了新标准的一部分。一、校验数字的表达式数字:[1]$n位的数字:^\d{n}$至少n位的数字:^\d{......
  • 《Java练习题》Java编程题合集(全)
    《Java练习题》Java编程题合集(全) 前言:不仅仅要实现,更要提升性能,精益求精,用尽量少的时间复杂度和空间复杂度解决问题。初学者:《Java练习题》习题集一  https://www.cnblogs.com/jssj/p/11147566.html《Java练习题》习题集二  https://www.cnblogs.com/jssj/p/1122235......
  • C++系列-模板初阶
    ......
  • C++向C#传结构体
    在写项目的时候,我需要将C++中接收到的结构体传输到我的C#项目中使用。结构体中基本是int,int[],float类型数据,这些类型在C++和C#中是一样的,可以直接传输,但是结构体怎么传输呢?下面是简单示例:MyStruct.hextern"C"{#pragmapack(1) typedefstruct_data1{ intid[4];......