力扣题集(第一弹)

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

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

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~26
    for (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++;
    }
}

结语

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JS图片二维码识别

前言 js识别QR图片&#xff0c;基于jsQR.js 代码 <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title>图片二维码识别</title><script src"https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js">…

什么是消息队列?

消息用队列的模式发送&#xff0c; 把要传输的数据放在队列中&#xff0c; 产生消息的叫做生产者&#xff0c; 从队列里取出消息的叫做消费者。 一、组成 生产者&#xff1a;Producer 消息的产生者与调用端 主要负责消息所承载的业务信息的实例化 是一个队列的发起方 代理…

网站小程序分类目录网源码系统+会员注册登录功能 附带完整的搭建教程

随着互联网的发展&#xff0c;小程序分类目录网站已经成为了人们获取各类信息的重要渠道。而在这个领域中&#xff0c;罗峰给大家分享一款网站小程序分类目录网源码系统以其强大的功能和易用性&#xff0c;脱颖而出。本系统集成了会员注册登录功能&#xff0c;让用户能够更加便…

uniapp H5 实现上拉刷新 以及 下拉加载

uniapp H5 实现上拉刷新 以及 下拉加载 1. 先上图 下拉加载 2. 上代码 <script>import DragableList from "/components/dragable-list/dragable-list.vue";import {FridApi} from /api/warn.jsexport default {data() {return {tableList: [],loadingHi…

Redis核心技术与实战【学习笔记】 - 6.Redis 的统计操作处理

1.前言 在 Web 业务场景中&#xff0c;我们经常保存这样一种信息&#xff1a;一个 key 对应了一个数据集合。比如&#xff1a; 手机 APP 中的每天用户登录信息&#xff1a;一天对应一系列用户 ID。电商网站上商品的用户评论列表&#xff1a;一个商品对应了一些列的评论。用户…

12 数据仓库理论

数仓基本概述 数据仓库基本概念 数据仓库是一个为数据分析而设计的企业级数据管理系统。数据仓库可集中 、整合多个信息源的大量数据。 数仓核心架构 数据仓库建模概述 数据仓库建模意义 数据模型就是数据组织和存储方法&#xff0c;它强调从业务、数据存取和使用角度合理…

Django配置websocket时的错误解决

基于移动群智感知的网络图谱构建系统需要手机app不断上传数据到服务器并把数据推到前端标记在百度地图上&#xff0c;由于众多手机向同一服务器发送数据&#xff0c;如果使用长轮询&#xff0c;则实时性差、延迟高且服务器的负载过大&#xff0c;而使用websocket则有更好的性能…

链表与二叉树-数据结构

链表与二叉树-数据结构 创建叶子node节点建立二叉树三元组&#xff1a;只考虑稀疏矩阵中非0的元素&#xff0c;并且存储到一个类&#xff08;三元组&#xff09;的数组中。 创建叶子node节点 class Node{int no;Node next;public Node(int no){this.nono;} } public class Lb…

YOLOv8改进 | 可视化热力图 | 支持YOLOv8最新版本密度热力图,和视频热力图

一、本文介绍 本文给大家带来的机制是集成了YOLOv8最新版本的可视化热力图功能,热力图作为我们论文当中的必备一环,可以展示出我们呈现机制的有效性,本文的内容支持YOLOv8最新版本的根据密度呈现的热力图,同时支持视频检测,根据视频中的密度来绘画热力图。 在开始之前给…

薅运营商羊毛?封杀!

最近边小缘在蓝点网上看到一则消息 “浙江联通也开始严格排查PCDN和PT等大流量行为 被检测到可能会封停宽带”。 此前中国联通已经在四川和上海等多个省市严查家庭宽带 (部分企业宽带也被查) 使用 PCDN 或 PT&#xff0c;当用户的宽带账户存在大量上传数据的情况&#xff0c;中…

数据库管理-第141期 DG PDB - Oracle DB 23c(20240129)

数据库管理141期 2024-01-29 第141期 DG PDB - Oracle DB 23c&#xff08;20240129&#xff09;1 概念2 环境说明3 操作3.1 数据库配置3.2 配置tnsname3.3 配置强制日志3.4 DG配置3.5 DG配置建立联系3.6 启用所有DG配置3.7 启用DG PDB3.8 创建源PDB的DG配置3.9 拷贝pdbprod1文件…

【C++】I/O多路转接详解(一)

目录 1. 背景引入1.1 IO的过程1.2 五种IO模型1.2.1 阻塞IO1.2.2 非阻塞IO1.2.3 信号驱动IO1.2.4 IO多路转接1.2.5 异步IO 1.3 同步通信 与 异步通信1.4 阻塞 与 非阻塞1.4.1 阻塞与非阻塞区别1.4.2 设置非阻塞IO 2. select2.1 接口使用2.2 select执行过程2.3 select代码实践 3.…

<网络安全>《9 入侵防御系统IPS》

1 概念 IPS&#xff08; Intrusion Prevention System&#xff09;是电脑网络安全设施&#xff0c;是对防病毒软件&#xff08;Antivirus Programs&#xff09;和防火墙&#xff08;Packet Filter, Application Gateway&#xff09;的补充。 入侵预防系统&#xff08;Intrusio…

JS第一课简单看看这是啥东西

1.什么是JavaScript JS是一门编程语言&#xff0c;是一种运行在客户端(浏览器)的编程语言&#xff0c;主要是让前端的画面动起来&#xff0c;注意HTML和CSS不是编程语言&#xff0c;他俩是一种标记语言。JS只要有浏览器就能运行不用跟Python或者Java一样上来装一个jdk或者Pyth…

2023年算法SAO-CNN-BiLSTM-ATTENTION回归预测(matlab)

2023年算法SAO-CNN-BiLSTM-ATTENTION回归预测&#xff08;matlab&#xff09; SAO-CNN-BiLSTM-Attention雪消融优化器优化卷积-长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 雪消融优化器( SAO) 是受自然界中雪的升华和融化行为的启发&#xff0c;开发了一种…

Docker入门篇(二)—— 命令

Docker入门篇&#xff08;二&#xff09;—— 命令 插播&#xff01;插播&#xff01;插播&#xff01;亲爱的朋友们&#xff0c;我们的Cmake/Makefile/Shell这三个课程上线啦&#xff01;感兴趣的小伙伴可以去下面的链接学习哦~ 构建工具大师-CSDN程序员研修院 一、引言 当…

二叉搜索树的后序遍历序列

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

利用Knife4j注解实现Java生成接口文档

文章目录 1、简介2、生成文档3、系列注解3.1、Api3.2、ApiResponses和ApiResponse3.3、ApiOperation3.4、Pathyvariable⭐3.5、RequestBody3.6、ApiOperationSupport3.7、ApiImplicitParams 和 ApiImplicitParam3.8、ApiModel3.9、ApiModelProperty ​&#x1f343;作者介绍&am…

动手学RAG:汽车知识问答

原文&#xff1a;动手学RAG&#xff1a;汽车知识问答 - 知乎 Part1 内容介绍 在自然语言处理领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;如GPT-3、BERT等已经取得了显著的进展&#xff0c;它们能够生成连贯、自然的文本&#xff0c;回答问题&#xff0c;并执行…

JUC并发编程-异步回调、JMM、volatile

15. 异步回调 Future 设计的初衷&#xff1a;对将来的某个事件结果进行建模&#xff01; 其实就是前端 --> 发送ajax异步请求给后端 但是我们平时都使用CompletableFuture 1&#xff09;异步调用&#xff1a;CompletableFuture 没有返回值的异步回调 public static void ma…