力扣题集(第一弹)

一日练,一日功;一日不练十日空。

学编程离不开刷题,接下来让我们来看几个力扣上的题目。

1. 242. 有效的字母异位词

题目描述 

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:输入: s = "anagram", t = "nagaram"
输出: true
示例 2:输入: s = "rat", t = "car"
输出: false提示:1 <= s.length, t.length <= 5 * 104
s 和 t 仅包含小写字母

给定函数 

bool isAnagram(char* s, char* t) 
{}

题意分析

有题目描述与示例可知:

给定的两个字符串具有以下特征:

< 1 > 两个字符串长度必然相同

< 2 > 两个字符串中每个字符出现的次数都相同(两个字符串中字符出现的种类和次数均相等)

< 3 > 两字符串都仅包含小写字母

如果两字符串属于字母异位词返回true,反之返回false。

解题思路详解

对于这一题目,我们采用哈希表解题法。由于一共只存在26个小写字母,因此我们可以创建一个长度为26的频次数组arr。

(1)判断两字符串长度是否相等,不等则返回false;

(2)创建一个长度为26的频次数组,计量字符串中每个字符出现的频次;

(3)先遍历s字符串,记录s字符串每个字符出现的频次;

(4)遍历t字符串,减去t字符串每个字符出现的频次

(一增一减之后,频次数组arr每个元素都应为0);

(5)遍历频次数组arr,如果有元素不等于0,则两字符串不是字母异位词。

代码实现

bool isAnagram(char* s, char* t)
{int n = strlen(s);int m = strlen(t);if (n != m)//如果两字符串长度不同,则必然不是字母异位词{return false;}int arr[26];memset(arr, 0, sizeof(arr));//字母 - ‘a’即字母之间ascll值相减,对应0~26for (int i = 0; i < n; i++)//计数法,出现则加一{arr[s[i] - 'a'] ++;}for (int i = 0; i < n; i++)//出现减一{arr[t[i] - 'a'] --;}for (int i = 0; i < 26; i++)//如果两字符串中字母出现次数相同,则数组每个元素仍为0{if (arr[i] != 0){return false;}}return true;
}

2.389. 找不同 

由于这一题与上面的题最为相似,就粗略讲一下。

题目描述 

 给定两个字符串 s 和 t ,它们只包含小写字母。

字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。

示例 1:输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。
示例 2:输入:s = "", t = "y"
输出:"y"提示:0 <= s.length <= 1000
t.length == s.length + 1
s 和 t 只包含小写字母

给定函数

char findTheDifference(char* s, char* t) 
{}

题意分析 

这一题与上一题基本类似, 总结以下特征:

< 1 > 题中的字符串都只存在小写字母;

< 2 > t字符由s字符打乱重排,然后在随机位置插入一个随即小写字母。

找出插入的字符并返回。

解题思路详解

 与上一题的字母异位词有异曲同工之妙,唯一不同的地方就是这里的频次数组有一个元素一定是为1的,我们只需要返回这个元素下标对应的字符。

(1)创建一个长度为26的频次数组,计量字符串中每个字符出现的频次;

(2)先遍历s字符串,记录s字符串每个字符出现的频次;

(3)遍历t字符串,减去t字符串每个字符出现的频次

(一增一减之后,频次数组arr有一个元素一定是为1);

(4)遍历频次数组arr,如果有元素等于1,则返回这个元素下标对应的字符。

注意:此处t字符串字符个数必然比s字符串个数多一个,因此在这里我们不需要遍历整个数组,只需要随t字符串的遍历寻找为1的元素。

代码实现 

char findTheDifference(char* s, char* t) 
{int cnt[26]={0};int n=strlen(s), m=strlen(t);for(int i=0;i<n;i++){cnt[s[i]-'a']++;}for(int j=0;j<m;j++) 此处m必然比n大1,因此在这一循环内寻找为1的元素即可{cnt[t[j]-'a']--;if(cnt[t[j]-'a']<0){return t[j];}}return ' ';
}

3.283. 移动零 

题目描述 

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:输入: nums = [0]
输出: [0]提示:1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1

进阶:你能尽量减少完成的操作次数吗? 

题意分析 

本题是一个非常简单的数组元素移动问题,将一个数组内的非零数全部迁移至左侧,零迁移至右侧。

但要求不能复制数组。

解题思路详解

思路一 

//本题要将所有非零数挪到数组左侧,所有为0的数移到数组右侧
//那么只需要将所有为0的数填充到左侧,右侧0补齐 

//将所有非零数移动到数组前端,再用零补全数组

这个思路极为简单,操作也相对方便,但时间复杂度为O(n+m)。 < m为用零补全数组的消耗 >

思路二 

 采用双指针法< 快慢指针法 >

定义左右两个指针,同时位于下标0处。遍历整个数组,使得左指针左侧均为非零数的序列,左指针与右指针之间均为0。遍历完整个数组后,左指针指向第一个零,右指针指向数组末尾。

这个思路相比于思路一难一点,但时间复杂度为O(n),只需遍历一遍数组。

具体做法

 定义左右指针都为0,
 左指针左边全为非零数序列,右指针与左指针之间均为0
 右指针遇到非零数与左指针交换并同时++
 右指针遇到0,右指针++,左指针不变
 逐渐将非零数移动至左指针左侧序列
 直到遍历完整个数组

代码实现 

思路一

void moveZeroes(int* nums, int numsSize)
{int n = 0;//作为操作下标for (int i = 0; i < numsSize; i++)//将所有非零数移动到数组前端{if (nums[i] != 0){nums[n++] = nums[i];}}for (int i = n; i < numsSize; i++)//再用零补全数组{nums[n++] = 0;}
}

思路二(进阶)

void Swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}void moveZeroes(int* nums, int numsSize)
{int left = 0, right = 0;while (right < numsSize){if (nums[right]){Swap(&nums[left], &nums[right]);{left++;}}right++;}
}

结语

力扣题集第一弹就到这里啦!欢迎各位大佬修正!

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

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

相关文章

【数据结构与算法】之哈希表系列-20240129

这里写目录标题 一、217. 存在重复元素二、219. 存在重复元素 II三、242. 有效的字母异位词四、268. 丢失的数字五、290. 单词规律六、349. 两个数组的交集七、350. 两个数组的交集 II 一、217. 存在重复元素 简单 给你一个整数数组 nums 。如果任一值在数组中出现至少两次 &a…

VS+QT 配置Eigen库

1、下载Eigen库&#xff0c;如下&#xff1a; 2、解压到项目目录下&#xff0c;如下&#xff1a; 3、 在C/C中包含文件&#xff0c;如下&#xff1a; 4、在头文件中加入如下代码&#xff1a; 5、测试代码&#xff1a; //.cpp文件 #include "testEigen.h"testEigen::…

Linux下安装edge

edge具有及其强大的功能&#xff0c;受到很多人的喜爱&#xff0c;它也开发Linux版本&#xff0c;下面是安装方法&#xff1a; 1.去edge官网下载Linux(.deb)文件。 https://www.microsoft.com/zh-cn/edge/download?formMA13FJ 2.下载之后输入以下指令&#xff08;后面是安装…

Blender 与 3ds Max | 面对面的直接较量(2024)

Blender和3ds Max&#xff0c;哪个动画软件更好&#xff1f;作为一个从事动画领域十年的专业人士&#xff0c;Mark McPherson提供了八条最新建议&#xff0c;帮助你了解哪个软件更适合满足你的3D动画需求。 1.建模 获胜者&#xff1a;3ds Max。3ds Max的建模机制已经被证明是…

软件架构设计

一、考点分布 软件架构的概念&#xff08;※※※&#xff09;基于架构的软件开发&#xff08;※※※※&#xff09;软件架构风格&#xff08;※※※※※&#xff09;特定领域软件架构&#xff08;※※※&#xff09;软件质量属性&#xff08;※※※※※&#xff09;软件架构评估…

第一节 分布式架构设计理论与Zookeeper环境搭建

1. 分布式架构设计理论 学习Zookeeper之前,我们需要掌握一些分布式系统基础知识&#xff1a;了解分布式系统的概念、原理。 配置管理 域名服务 分布式同步 发布订阅 1. 分布式架构介绍 1.1 什么是分布式 《分布式系统原理和范型》一书中是这样定义分布式系统的&#xff1a…

【ArcGIS微课1000例】0099:土地利用变化分析

本实验讲述在ArcGIS软件中基于两期土地利用数据,做土地利用变化分析。 文章目录 一、实验描述二、实验过程三、注意事项一、实验描述 对城市土地利用情况进行分析时,需要考虑不同时期土地利用图层在空间上的差异性,如农用地转建筑用地的空间变化。而该变化过程表现为各时期…

C#,贝尔数(Bell Number)的计算方法与源程序

1 埃里克坦普尔贝尔 贝尔数是组合数学中的一组整数数列&#xff0c;以埃里克坦普尔贝尔&#xff08;Eric Temple Bell&#xff09;命名&#xff0c; 埃里克坦普尔贝尔&#xff08;生于1883年2月7日&#xff0c;苏格兰阿伯丁郡阿伯丁&#xff0c;于1960年12月21日在美国加利福尼…

2024年数学建模美赛C题(预测 Wordle)——思路、程序总结分享

1: 问题描述与要求 《纽约时报》要求您对本文件中的结果进行分析&#xff0c;以回答几个问题。 问题1&#xff1a;报告结果的数量每天都在变化。开发一个模型来解释这种变化&#xff0c;并使用您的模型为2023年3月1日报告的结果数量创建一个预测区间。这个词的任何属性是否会…

设计模式——模板方法模式(Template Method Pattern)

概述 模板方法模式&#xff1a;定义一个操作中算法的框架&#xff0c;而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法模式是一种基于继承的代码复用技术&#xff0c;它是一种类行为型模式。模板方法模式是结…

【开源】JAVA+Vue.js实现超市商品管理系统

目录 一、摘要1.1 简介1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 超市区域模块2.3 超市货架模块2.4 商品类型模块2.5 商品档案模块 三、系统设计3.1 用例图3.2 时序图3.3 类图3.4 E-R图 四、系统实现4.1 登录4.2 注册4.3 主页4.4 超市区域管理4.5 超市货架管理4.6 商品类型…

标准库中的string类(下)——“C++”

各位CSDN的uu们你们好呀&#xff0c;这段时间小雅兰的内容仍然是Cstring类的使用的内容&#xff0c;下面&#xff0c;让我们进入string类的世界吧&#xff01;&#xff01;&#xff01; string类的常用接口说明 string - C Reference string类的常用接口说明 string类对象的修…

一文理清楚-Docker 容器如何工作

Docker 容器如何工作 集装箱什么是虚拟机&#xff1f;虚拟化如何运作&#xff1f;什么是容器&#xff1f;什么是 Docker&#xff1f;总结 五星上将麦克阿瑟曾经说过&#xff1a;在docker面前&#xff0c;虚拟机就是个弟弟 集装箱 《盒子&#xff1a;集装箱如何让世界变得更小&…

【BUG】golang gorm导入数据库报错 “unexpected type clause.Expr“

帮同事排查一个gorm导入数据报错的问题 事发现场 ck sql CREATE TABLE ods_api.t_sms_jg_msg_callback_dis (app_key String DEFAULT COMMENT 应用标识,callback_type Int32 DEFAULT 0 COMMENT 0送达&#xff0c;1回执,channel Int32 DEFAULT 0 COMMENT uid下发的渠道,mode…

自定义vue通用左侧菜单组件(未完善版本)

使用到的技术&#xff1a; vue3、pinia、view-ui-plus 实现的功能&#xff1a; 传入一个菜单数组数据&#xff0c;自动生成一个左侧菜单栏。菜单栏可以添加、删除、展开、重命名&#xff0c;拖动插入位置等。 效果预览&#xff1a; 代码&#xff1a; c-menu-wrap.vue <t…

【Linux】压缩脚本、报警脚本

一、压缩搅拌 要求&#xff1a; 写一个脚本&#xff0c;完成如下功能 传递一个参数给脚本&#xff0c;此参数为gzip、bzip2或者xz三者之一&#xff1b; (1) 如果参数1的值为gzip&#xff0c;则使用tar和gzip归档压缩/etc目录至/backups目录中&#xff0c;并命名为/backups/etc…

鸿蒙OS之Rust开发

背景 Rust是一门静态强类型语言&#xff0c;具有更安全的内存管理、更好的运行性能、原生支持多线程开发等优势。Rust官方也使用Cargo工具来专门为Rust代码创建工程和构建编译。 OpenHarmony为了集成C/C 代码和提升编译速度&#xff0c;使用了GN Ninja的编译构建系统。GN的构…

Open CASCADE学习|遍历曲面的边

目录 1、球面的Brep数据 2、C遍历球面的边 ​这里以球面为例来说明如何遍历曲面的边。 1、球面的Brep数据 使用Tcl命令在Draw Test Harness中生成的球面并到出Brep数据如下&#xff1a; pload ALL psphere asphere 1 dump asphere 结果如下&#xff1a; *********** D…

构建高效外卖系统:利用Spring Boot框架实现

在当今快节奏的生活中&#xff0c;外卖系统已经成为人们生活中不可或缺的一部分。为了构建一个高效、可靠的外卖系统&#xff0c;我们可以利用Spring Boot框架来实现。本文将介绍如何利用Spring Boot框架构建一个简单但功能完善的外卖系统&#xff0c;并提供相关的技术代码示例…

Qt SQLite3数据库加密 QtCipherSqlitePlugin

在客户端软件开发过程中&#xff0c;基本都会涉及到数据库的开发。QT支持的数据库也有好几种&#xff08;QSQLITE, QODBC, QODBC3, QPSQL, QPSQL7&#xff09;&#xff0c;SQLite就是其中之一&#xff0c;但这个 SQLite 是官方提供的开源版本&#xff0c;没有加密功能的。如果对…