Leetcode算法题练习(一)

news2024/11/26 13:29:46

目录

一、前言

二、移动零

三、复写零

四、快乐数

五、电话号码的字母组合

六、字符串相加


 

一、前言

大家好,我是dbln,从本篇文章开始我就会记录我在练习算法题时的思路和想法。如果有错误,还请大家指出,帮助我进步。谢谢!


二、移动零

链接:移动零

题目描述:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。

51e905280c474dc99160762ae34c2267.png

思路:我们可以使用双指针来帮助我们解决这个问题。

1、如果cur位置是0,则cur++

2、如果cur位置是非0,则我们将dest+1位置的数和cur位置的数交换,然后cur++, dest++

 

2f82c0c3472b4d22961d9a76a0a164cf.png

 

代码实现:

void swap(int* a, int* b)
{
    int c = *a;
    *a = *b;
    *b = c;
}

void moveZeroes(int* nums, int numsSize)
{
    int cur = 0;
    int dest = -1;
    while(cur < numsSize)
    {
        if(nums[cur] == 0)
        {
            cur++;
        }
        else
        {
            swap(&nums[dest+1], &nums[cur]);
            dest++;
            cur++;
        }
    }
}

b783bcbe497c4725b3bc9d5f1e9d0d6f.png


 

三、复写零

链接:复写零

题目描述:给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。注意:请不要在超过该数组长度的位置写入元素。请对输入的数组就地进行上述修改,不要从函数返回任何东西。

cb838519bd004d2d93398ea120964a5a.png

思路:1、我们首先需要找到最后一个需要复写的数字,这里我们可以使用双指针算法(指针cur用来扫描数组,判断该位置是否为0,指针dest用来表示cur位置的数字的复写次数,如果非0,dest移动一步,否则移动两步,当dest >= n-1就结束,cur位置结束最后一个需要复写的数字)

c337b2c3793a46728c370eafbdce7e37.png

 

           2、然后从后往前进行复写

           3、提交后发现没有通过,原来还有一些特殊情况没有处理,如下图。我们发现下面这种情况的数组在执行完步骤1后,dest已经越界了,如果这时我们仍然进行复写就会出错,因此我们需要修正一下边界:将dest-1的位置修改为0,cur--,dest -= 2。然后正常进行复写。

5c1dc2ad8d7249ed98c8bfd376425b86.png

 

代码实现:

class Solution 
{
public:
    void duplicateZeros(vector<int>& arr) 
    {
        //1、找到最后一个需要复写的数字
        int cur = 0, dest = -1;
        int n = arr.size();
        while(cur < n)
        {
            if(arr[cur] != 0)
            {
                dest++;
            }
            else
            {
                dest += 2;
            }
            
            if(dest >= n-1)
            {
                break;
            }
            cur++;
        }

        //修正边界 [1,0,2,3,0,4]
        if(dest == n)
        {
            arr[n-1] = 0;
            cur--;
            dest -= 2;
        }

        //3、从后往前复写
        while(cur >= 0)
        {
            if(arr[cur] == 0)
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }
            else
            {
                arr[dest--] = arr[cur--];
            }
        }
    }
};

21e90f5f67d848c09f8f3045f108a124.png


 

四、快乐数

链接:快乐数

题目描述:

编写一个算法来判断一个数 n 是不是快乐数。

快乐数的定义为:

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果这个过程结果为 1,那么这个数就是快乐数。如果 n 是快乐数就返回 true ;不是,则返回 false 。

3cee113111ae4c65bf2ec4f0680f3bc3.png

思路:根据下面的图我们来进行分析

          1、首先,我们根据第二组数所形成的一个环形可以大胆地推测这道题或许和快慢指针的追及相遇问题有关。然后,我们根据题意就可以知道快乐数经过有限次的变化会变成1,而非快乐数就会无限循环,永远不会到1,我们就断定我们可以根据快慢指针的思想判断是否有环,来判断是否是快乐数。

         2、我们可以先封装一个函数专门来计算一个数每个位置上的数字的平方和。

         3、然后慢指针表示第一个数,快指针表示第二个数。

         4、慢指针一次移动一步,快指针依次移动两步。

         5、如果最后慢指针变成了1,那么这个数就是快乐数,如果两者相遇,就不是快乐数。

aeb31d86829a439c8eeb96a59c9e28ba.png

 

代码实现: 

class Solution 
{
public:
    int SquareSum(int n)
    {
        int sum = 0;
        while(n)
        {
            int t = n % 10;
            sum += t*t;
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n) 
    {
        int slow = n, fast = SquareSum(n);
        while(slow != fast)
        {
            slow = SquareSum(slow);
            fast = SquareSum(SquareSum(fast));
        }
        return slow==1;
    }
};

cd6286007143431c8e052ad55b9ad984.png


五、电话号码的字母组合

链接:电话号码的字母组合

题目描述:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

3b0c2fdcf2304289abeeabb7e6ca78b7.png

思路: 1、首先我们可以先定义一个数字到对应字符串的映射的数组。

            2、

f07594c297144c5e86c2988f0a694ecf.png

 

代码实现:

class Solution 
{
public:
    char* numtostr[10] = {" ", " ", "abc", "def", "ghi", "jkl", "mno", 
"pqrs", "tuv", "wxyz"};

    void combine(string digits, int di, vector<string>& v, string combinestr)
    {
        if(di == digits.size())
        {
            v.push_back(combinestr);
            return;
        }

        int num = digits[di] - '0';
        string str = numtostr[num];
        for(auto ch : str)
        {
            combine(digits, di+1, v, combinestr+ch);
        }
    }

    vector<string> letterCombinations(string digits) 
    {
        vector<string> retv;
        string str;

        if(digits.empty())
        {
            return retv;
        }
        combine(digits, 0, retv, str);
        return retv;
    }
};

06be4227bda6411cae5f58a709eae5cc.png

 

 


六、字符串相加

 链接:字符串相加

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

9616d35c7d584058b625b48d42ca65fd.png

 思路:

对两个字符串从后往前逐位相加,并将其转换成字符插入到新的string中,同时记录下进位情况。

记得处理特殊情况:最后可能存在进位。

代码实现:

class Solution 
{
public:
    string addStrings(string num1, string num2) 
    {
        int end1 = num1.size()-1;
        int end2 = num2.size()-1;
        int next = 0;
        string strRet;
        while(end1>=0 || end2>=0)
        {
            int val1 = end1>=0 ? num1[end1] - '0' : 0;
            int val2 = end2>=0 ? num2[end2] - '0' : 0;
            int ret = val1 + val2 + next;
            next = ret > 9 ? 1 : 0;
            strRet.insert(0, 1, '0' + (ret%10));
            end1--;
            end2--;
        }
        if(next)
            strRet.insert(0, 1, '0' + 1);

        return strRet;
    }
};

​

53f4ca392d97461298ec0a991b488d2b.png

 

 

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

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

相关文章

2023-9-27 JZ55 二叉树的深度

题目链接&#xff1a;二叉树的深度 import java.util.*; /** public class TreeNode {int val 0;TreeNode left null;TreeNode right null;public TreeNode(int val) {this.val val;}} */ public class Solution {public int TreeDepth(TreeNode root) {if(root null) ret…

续航605km,价格 11.77 万起带激光雷达,你卷我也卷

9 月 21 日&#xff0c;睿蓝 7 正式上市&#xff0c;新车提供 6 款车型&#xff0c;售价区间 11.77-17.37 万元。 权益方面&#xff0c;提供 701 元订金抵 2000 元车款、2000 元选装基金、终身 24 小时救援服务、10 万 3 年 0 息金融政策、3000 元置换/ 1000 元增购补贴、6 年/…

【Java 进阶篇】MySQL主键约束详解

MySQL是一个强大的关系型数据库管理系统&#xff0c;用于存储和管理大量数据。在数据库中&#xff0c;主键约束是一项非常重要的概念&#xff0c;它有助于确保数据的完整性和唯一性。本文将详细介绍MySQL主键约束&#xff0c;包括什么是主键、为什么需要主键、如何创建主键以及…

自增自减运算符i++与++i的区别

自增自减运算符用作前缀与用作后缀时略有不同。 i和i的区别&#xff1a; 1、i 返回原来的值&#xff0c;i 返回加1后的值。&#xff08; a i 是先给 a 赋值&#xff0c;然后 i 再自增&#xff1b;a i是 i 先自增&#xff0c;然后给 a 赋值。&#xff09; #include<iost…

(2023|ICLR,检索引导,交叉引导,EntityDrawBench)Re-Imagen:检索增强的文本到图像生成器

Re-Imagen: Retrieval-augmented text-to-image generator 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 3. 模型 3.1 预备知识 3.2 用多模态知识…

msvcp140.dll丢失的解决方法与msvcp140.dll是什么东西详细解析

在使用电脑时&#xff0c;可能会遇到打开软件时提示“找不到 msvcp140.dll&#xff0c;无法继续执行代码”的问题。这通常意味着你的计算机上缺少 Microsoft Visual C Redistributable 的运行时库&#xff0c;或者该库的版本不正确。下面是我找了几天的修复方法&#xff0c;今天…

PBR的应用

项目拓扑与项目需求 项目需求&#xff1a;某企业网络拥有三个出口&#xff0c;分别使用AR1、AR2、AR3链接运营商网络。其中AR1为万兆出口&#xff0c;而AR2、AR3为千兆出口。现在需要实现以下需求&#xff1a; 希望vlan10的流量能够强制通过AR1作为业务的出口&#xff0c;vla…

iCloud邮箱怎么登录?看这里,2招教你搞定!

iCloud邮箱是苹果公司推出的一款功能强大的邮件服务。通过iCloud邮箱&#xff0c;用户可以实现接收和发送电子邮件。苹果强调保护用户的隐私和数据安全&#xff0c;所以icloud邮箱为用户提供了高度保密的邮件加密服务&#xff0c;能够确保用户的邮件在传输时得到保护。 但是&a…

Kotlin语言基础(三)- 函数

函数可以定义特定功能的代码块。 一、函数定义 Kotlin语言定义函数的基本形式&#xff1a; fun 函数名(【参数&#xff1a;参数类型,参数&#xff1a;参数类型…】)【:返回值类型】{ //函数体 } 如果函数体只有一条返回值&#xff0c;也可以简化成如下形式&#xff1a; fun 函…

springboot实现ACL+RBAC权限体系

本文基于web系统的权限控制非常重要的前提下&#xff0c;从ALC和RBAC权限控制两个方面&#xff0c;介绍如何在springboot项目中实现一个完整的权限体系。 源码下载 &#xff1a;https://gitee.com/skyblue0678/springboot-demo 序章 一个后台管理系统&#xff0c;基本都有一套…

更好用的Mybatis Plus:Mybatis Flex(下)

前言 上篇文章讲了 Mybaits Flex 的基础用法&#xff0c;这次讲一下 Mybatis Flex 的进阶用法&#xff0c;包含了一些 Mybatis Flex 核心的一些功能。&#xff08;以下简称 MF&#xff09; 逻辑删除 上篇文章讲到了 Column 注解&#xff0c;其中有个属性为 isLogicDelete &…

2023软工作业(一)——计算器

班级班级社区作业要求软件工程实践第一次作业-CSDN社区作业目标完成一个具有可视化界面的科学计算器参考文献Fyne 目录 作业要求 项目源码地址 作业目标 0. 界面及功能展示 1. PSP表格 2. 解题思路描述 3. 核心代码 4. 设计与实现过程 5. 程序性能改进 6. 单元测试展…

向华为学习:制订一份分工明确、能够落地的产品GTM行动计划表

昨天华研荟介绍了新产品上市的GTM的定义、GTM这个岗位&#xff08;角色&#xff09;的主要工作以及新产品的GTM要回答好的四个问题&#xff08;Why、What、How、Where&#xff09;&#xff0c;帮助大家初步理解了让产品上市更成功的GTM流程。 如我昨天在文章中所讲到的&#x…

ACM MM 2023 | 基于去中心化表征的人体姿态估计方法

01. 前言 北京邮电大学与EVOL创新团队共同提出人体姿态估计方法DecenterNet&#xff0c;用于在提高在拥挤场景下人体姿态估计的准确度。该方法引入了一种去中心化的姿势表征方法&#xff0c;使得网络在纠缠区域/拥挤区域中将更加稳健地表达人体姿态。该方法还提出了一个解耦的…

LeetCode【577. 员工奖金】

表&#xff1a;Employee ---------------------- | Column Name | Type | ---------------------- | empId | int | | name | varchar | | supervisor | int | | salary | int | ---------------------- empId 是该表中具有唯一值的列。 该…

BFS专题7 多终点迷宫问题

题目&#xff1a; 样例&#xff1a; 输入 3 3 0 0 0 1 0 0 0 1 0 输出 0 1 2 -1 2 3 -1 -1 4 思路&#xff1a; 单纯的 BFS 迷宫问题&#xff0c;只是标记一下每个点的 step&#xff0c;注意初始化答案数组都为 -1. 代码详解如下&#xff1a; #include <iostream> #…

Windows下使用pybind11教程(python调用C++代码)

1. 下载pybind11 gittub中下载&#xff0c;pybind下载后解压 2. C生成库文件 2.1.VS新建空白工程&#xff0c;工程名随意起 - 2.2更改目标文件名和配置类型 - 2.3更改目标文件拓展名 2.4添加include路径和库路径 包含目录中添加刚刚下载好的pybind的include路径以及pyhon的…

C#的HALCON引擎调用_传入参数输出结果实现流程

1、在Halcon的开发环境里面写处理流程。 此案例使用HALCON自带图片&#xff1a; read_image (Image, printer_chip/printer_chip_01) 读入图片之后&#xff0c;做处理流程&#xff1a; *图像处理流程&#xff1a; *传入图像变量&#xff0c;阈值最小值&#xff0c;最大值。…

软件测试/测试开发丨利用人工智能自动找Bug

点此获取更多相关资料 简介 在程序员编程的过程中&#xff0c;产生Bug是一件平常的事情&#xff0c;以前在编码的过程中提前找出Bug&#xff0c;需要通过单元测试、CodeReview等各种方式。 当今&#xff0c;人工智能技术的发展给软件开发和测试带来了许多机会。利用人工智能…

聊聊并发编程——多线程之AQS

目录 队列同步器&#xff08;AQS&#xff09; 独占锁示例 AQS之同步队列结构 解析AQS实现 队列同步器&#xff08;AQS&#xff09; 队列同步器AbstractQueuedSynchronizer&#xff08;以下简称同步器&#xff09;&#xff0c;是用来构建锁或者其他同步组 件的基础框架&…