刷题日记:面试经典 150 题 DAY5

刷题日记:面试经典 150 题 DAY4

  • 125. 验证回文串
  • 28. 找出字符串中第一个匹配项的下标
  • 151. 反转字符串中的单词
  • 6. Z 字形变换
  • 68. 文本左右对齐

125. 验证回文串

原题链接 125. 验证回文串

双指针,一前一后,遇到非数字字母跳过即可

class Solution {
public:bool isPalindrome(string s) {int i = 0, j = s.size()-1;while(i < j) {while(i<j && !isalnum(s[i])) i++;while(i<j && !isalnum(s[j])) j--;if(tolower(s[i]) != tolower(s[j])) {return false;}i++, j--;}return true;}
};

28. 找出字符串中第一个匹配项的下标

原题链接 28. 找出字符串中第一个匹配项的下标

子串匹配问题,有很多算法,其中最著名的是KMP算法,时间复杂度是 O ( M + N ) O(M+N) O(M+N)。之前短暂的理解过,现在又不明白了。贴一个讲解 可能是全网最清晰的KMP算法讲解
理解不了就硬背

class Solution {
public:int strStr(string haystack, string needle) {int len_n = needle.size();int next[len_n];next[0] = -1;for(int i = 1, j = -1;i < len_n;i++){while(j > -1 && needle[i] != needle[j+1]) j = next[j];if(needle[i] == needle[j+1]) j++;next[i] = j;}for(int i = 0, j = -1;i < haystack.size();i++) {while(j > -1 && haystack[i] != needle[j+1]) j = next[j];if(haystack[i] == needle[j+1]) j++;if(j == len_n-1) {return i-len_n+1;}}return -1;}
};

找到一个好理解的Sunday算法
算法仍然包括两步:预处理和移动模式串
基本流程是:

  • 左对齐,开始进行匹配在这里插入图片描述
  • 一旦匹配失败,对“下一位”进行检查在这里插入图片描述
  • 找到模式串中该字母最后出现的位置,然后对齐,开启下一轮匹配在这里插入图片描述
    为了加速这个过程,我们预处理出一个键值对,键即字母表中的各个字母,对应的值是该字母在模式串中出现的位置(事实上,我们使用一个数组进行模拟;并且处理值,使得其意味着“此时模式串应该向后平移几位”)
class Solution {
public:int strStr(string haystack, string needle) {int n = haystack.size(), m = needle.size();if(m > n) return -1;vector<int> shifts(26,m+1);for(int i = 0;i < m;i++) {shifts[needle[i]-'a'] = m-i;}int s = 0, i;while(s <= n-m) {i = 0;while(haystack[s+i] == needle[i]) {i++;if(i == m) {return s;}}if(s+m >= n) break;s += shifts[haystack[s+m]-'a'];}return -1;}
};

151. 反转字符串中的单词

原题链接 151. 反转字符串中的单词

  • 第一步,去掉前后的空格
  • 第二步,双指针,均从串末尾开始遍历,一个指向单词的开头,一个指向单词的结尾
    • 交替地判断正在被遍历的是字母还是空格
class Solution {
public:string reverseWords(string s) {int i,j;int len = s.size();for(i = 0;i < len && s[i] == ' ';i++);for(j = len-1;j >= 0 && s[j] == ' ';j--);s = s.substr(i,j-i+1);i = s.size()-1;j = s.size()-1;string result = "";while(i >= 0) {while(i >= 0 && s[i] != ' ') i--;result += s.substr(i+1,j-i) + " ";while(i >= 0 && s[i] == ' ') i--; j = i;}result = result.substr(0,result.size()-1);return result;}
};

6. Z 字形变换

原题链接 6. Z 字形变换

直接分类讨论,设我们讨论在Z字形中的第i行第j个字母,其在原串中的位置是index

  • 每一行的index都从i开始
  • 对于第一行和最后一行,j每增加1,index增加2*(numRows-1)
  • 对于中间
    • j是偶数,则index增加2*(numRows-i-1)
    • j是奇数,则index增加2*i
class Solution {
public:string convert(string s, int numRows) {int len = s.size();if(numRows == 1 ||  len <= numRows) return s;string result;int t = 2*(numRows-1);for(int i = 0;i < numRows;i++) {int j = 0;int index = i;while(index < len) {result.push_back(s[index]);if(i == 0 || i == numRows-1) {index += t;} else if(j%2 == 0) {index += t-2*i;} else {index += 2*i;}j++;}}return result;}
};

68. 文本左右对齐

原题链接 68. 文本左右对齐

做的我有点脑溢血了,大致分三步

  • 第一步,将原单词列分成连续的区间,每个区间中的单词应该以左右对齐放在一行中
    • 设单词数量是 n n n,单词总长度是 s u m sum sum,则满足 s u m + n − 1 ≤ m a x W i d t h sum+n-1 \leq maxWidth sum+n1maxWidth的尽可能长的一组单词应该放到一行(即,最少在每个单词之间放一个空格)
      • 这一步我脑残突然发了,死活写不出来。其实简化一下问题就是:有一个数组,一个最大和maxSum。写一个函数,将数组分成几个尽可能长的连续片段,使得在每个连续片段内,数组元素的和都小于等于maxSum。代码应该是:

        vector<vector<int>> splitArray(const vector<int>& nums, int maxSum) {vector<vector<int>> result;int currentSum = 0;vector<int> currentSegment;for (int num : nums) {if (currentSum + num > maxSum) {// 当前片段的和超过maxSum,将当前片段加入结果,并开始新的片段result.push_back(currentSegment);currentSegment.clear();currentSum = 0;}currentSegment.push_back(num);currentSum += num;}// 将最后一个片段加入结果result.push_back(currentSegment);return result;
        }
        
        • 应该是 执行循环判断是否下标越界–>再循环内先判断是否已经超出最大和–>构造序列
  • 第二步,对每组单词,执行左右对齐。假设需要 s s s个空格放到 n n n个间隔之中去,思路是先给每个间隔分配 ⌊ s n ⌋ \lfloor \frac{s}{n} \rfloor ns个空格,再给前 s m o d n s \mod n smodn个间隔多分配上一个空格
  • 第三步,给剩下的单词分配左对齐。这个好说。
class Solution {
public:struct Line {int st;int ed;int lw;};string space_factory(int n) {return string(n,' ');}vector<string> fullJustify(vector<string>& words, int maxWidth) {int len = words.size();int wordsize[len];for(int i = 0;i < len;i++) {wordsize[i] = words[i].size();}vector<Line> lines;int start = 0, count = 0, sum = 0;while(start < len) {count = 0;sum = 0;while(start+count < len) {if(sum+count+wordsize[start+count]>maxWidth) {lines.push_back({start,start+count-1,sum});break;}sum += wordsize[start+count];count++;}start += count;}start -= count;vector<string> res;for(int i = 0;i < lines.size();i++) {auto line = lines[i];int sum_spaces = maxWidth-line.lw;string new_line = "";new_line += words[line.st];if(line.st == line.ed) {new_line += space_factory(sum_spaces);} else {int sigle_spaces = (sum_spaces)/(line.ed-line.st);int remain_spaces = (sum_spaces)%(line.ed-line.st);for(int j = 1;line.st+j<=line.ed;j++) {if(j-1 < remain_spaces) {new_line += space_factory(sigle_spaces+1);} else {new_line += space_factory(sigle_spaces);}new_line += words[line.st+j];}}res.push_back(new_line);}string new_line = "";new_line += words[start];sum = wordsize[start];for(int i = start+1;i < len;i++) {new_line += " ";new_line += words[i];sum +=  wordsize[i];}new_line += space_factory(maxWidth-sum-(len-start-1));res.push_back(new_line);return res;}
};

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

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

相关文章

腾讯云哪款服务器最便宜划算?2024腾讯云服务器优惠价格表

腾讯云优惠活动2024新春采购节活动上线&#xff0c;云服务器价格已经出来了&#xff0c;云服务器61元一年起&#xff0c;配置和价格基本上和上个月没什么变化&#xff0c;但是新增了8888元代金券和会员续费优惠&#xff0c;腾讯云百科txybk.com整理腾讯云最新优惠活动云服务器配…

TCP三次握手四次挥手

目录 TCP报文 ☞ 标志位 TCP状态变迁图&#xff1a; 三次握手 为什么要三次握手&#xff1f; 客户端与服务端接口状态 客户端&#xff1a; 服务端&#xff1a; 第一次握手&#xff1a; 第二次握手&#xff1a; 第三次握手&#xff1a; 四次挥手&#xff1a; 四次挥…

火爆全网,软件测试数据库常用 SQL 语句总结,你要的我都有......

前言 直接上干货 数据定义语言(DDL) 主要负责数据库、数据表、视图、键、索引等结构化的操作 常用的语句有&#xff1a;CREATE DATABASE、CREATE TABLE、ALTER TABLE等 字段的常用约束有&#xff1a;PRIMARY KEY、FOREIGN KEY、NOT NULL、UNIQUE、AUTO_INCREMENT、DEFAULT 常…

onnx模型优化利器onnxoptimizer、onnxsim

ONNX性能优化和调试技巧 - 知乎ONNX模型是一种跨平台、跨框架的模型表示格式,允许用户在不同的深度学习框架之间共享模型和数据,从而加速模型开发和部署。然而,在实际应用中,我们通常需要对ONNX模型进行性能优化和调试,以确保其在不同硬件和…https://zhuanlan.zhihu.com/…

PTA L2-011 玩转二叉树

给定一棵二叉树的中序遍历和前序遍历&#xff0c;请你先将树做个镜面反转&#xff0c;再输出反转后的层序遍历的序列。所谓镜面反转&#xff0c;是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。 输入格式&#xff1a; 输入第一行给出一个正整数N&…

CIP通讯介绍(欧姆龙PLC)

什么是CIP CIP通信是Common Industrial Protocl(CIP)的简称&#xff0c;它是一个点到点的面向对象协议&#xff0c;能够实现工业器件&#xff08;传感器&#xff0c;执行器&#xff09;之间的连接&#xff0c;和高等级的控制器之间的连接。目前&#xff0c;有3种网络DeviceNet…

MySQL--优化(索引--索引创建原则)

MySQL–优化&#xff08;索引–索引创建原则&#xff09; 定位慢查询SQL执行计划索引 存储引擎索引底层数据结构聚簇和非聚簇索引索引创建原则索引失效场景 SQL优化经验 一、索引创建原则 我们使用的索引种类&#xff1a; 主键索引唯一索引根据业务创建的索引&#xff08;复…

怎么给视频活码加入时间设置?限时扫码看视频的制作方法

视频二维码是常见的一种二维码类型&#xff0c;很多人会通过这种方式来分享视频内容&#xff0c;可能某些情况下需要对制作的二维码图片加入扫码限制&#xff0c;比如有效期、填写密码、限制预览时间等设置&#xff0c;那么这些需求怎么在生成二维码时实现呢&#xff1f; 对于…

JAVA 用二分法查找数组中是否存在某个值

二分法查找的概念 二分查找也称折半查找&#xff08;Binary Search&#xff09;&#xff0c;它是一种效率较高的查找方法。首先&#xff0c;将表中间位置记录的关键字与查找关键字比较&#xff0c;如果两者相等&#xff0c;则查找成功&#xff1b;否则利用中间位置记录将表分成…

spring-security 项目实战(一)个人健康档案

spring-security 项目实战&#xff08;一&#xff09;个人健康档案 项目说明项目地址框架信息 代码分析配置类解析默认登录页登录接口执行逻辑登录认证成功之后重定向到main页面过程未登录之前访问 /main生成默认登录页点击登录 登录之后访问 /main执行流程清空认证信息 项目来…

低空经济20人|卓翼智能任雪峰:以技术驱动市场,引领无人机细分领域创新

作为国内系留无人机领域的领头羊企业&#xff0c;卓翼智能致力于提供智能无人系统解决方案。本期“低空经济20人”请到卓翼智能CEO任雪峰分享他对系留无人机研发应用的经验以及未来无人机行业生态发展的观点。 如今&#xff0c;无人机的应用场景逐渐广泛&#xff0c;在社会发展…

18个惊艳的可视化大屏(第20辑):物联网场景

实时监控和管理 物联网系统通常涉及大量的传感器、设备和数据&#xff0c;通过将这些数据可视化展示在大屏上&#xff0c;可以实时监控和管理物联网系统的运行状态。这有助于及时发现问题、快速响应&#xff0c;并提高系统的可靠性和稳定性。 数据分析和决策支持 可视化大屏可…

软件测试--性能测试实战篇

软件测试--性能测试实战篇 项目介绍和部署1. 轻商城项目介绍1.1 背景1.2 简介2. 项目功能架构3. 项目技术架构4. 熟悉数据库设计5. 轻商城项目搭建5.1 准备工作5.2 项目搭建步骤性能测试需求分析1. 性能测试需求分析1.1 如何获取有效的需求2. 性能测试点的提取2.1 性能测试点的…

第五十二回 戴宗二取公孙胜 李逵独劈罗真人-飞桨AI框架安装和使用示例

吴用说只有公孙胜可以破法术&#xff0c;于是宋江请戴宗和李逵去蓟州。两人听说公孙胜的师傅罗真人在九宫县二仙山讲经&#xff0c;于是到了二仙山&#xff0c;并在山下找到了公孙胜的家。 两人请公孙胜去帮助打高唐州&#xff0c;公孙胜说听师傅的。罗真人说出家人不管闲事&a…

SpringMVC 中的常用注解和用法

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 注解 1. MVC定义2. 注解2.1 RequestMappin…

leetcode:LCR 006. 两数之和 II - 输入有序数组(python3解法)

难度&#xff1a;简单 给定一个已按照 升序排列 的整数数组 numbers &#xff0c;请你从数组中找出两个数满足相加之和等于目标数 target 。 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 &#xff0c;所以答案数组应当满足 0 <…

el-dialog封装组件

父页面 <template><div><el-button type"primary" click"visible true">展示弹窗</el-button><!-- 弹窗组件 --><PlayVideo v-if"visible" :visible.syncvisible /></div> </template><sc…

谷粒学院--在线教育实战项目【一】

谷粒学院--在线教育实战项目【一】 一、项目概述1.1.项目来源1.2.功能简介1.3.技术架构 二、Mybatis-Plus概述2.1.简介2.2.特性 三、Mybatis-Plus入门3.1.创建数据库3.2.创建 User 表3.3.初始化一个SpringBoot工程3.4.在Pom文件中引入SpringBoot和Mybatis-Plus相关依赖3.5.第一…

融资项目——OpenFeign的降级与熔断

当一个微服务调用其他微服务时&#xff0c;如果被调用的微服务因各种原因无法在规定时间内提供服务&#xff0c;则可以直接使用本地的服务作为备选&#xff0c;即进行降级熔断。 如之前所提到的微服务为例&#xff1a; 如果希望实现降级熔断&#xff0c;可以在本地创建一个实现…

AI改变游戏规则:内容创作的新时代!

AI技术&#xff0c;尤其是人工智能&#xff08;AI&#xff09;在内容创作领域的应用&#xff0c;正开启了一个全新的时代。这一时代的核心在于利用AI的能力&#xff0c;不仅提高内容创作的效率&#xff0c;还能引入前所未有的创新元素&#xff0c;从而彻底改变游戏规则。 AI在…