刷题日记:面试经典 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;
    }
};

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

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

相关文章

passwd: Authentication token manipulation error

passwd: Authentication token manipulation error 身份验证令牌操作错误。 可能原因&#xff1a; 1、密码文件无修改权限&#xff08;有i权限&#xff09; lsattr /etc/{passwd,shadow} 取消方法 chattr -i /etc/passwd chattr -i /etc/passwd 2、/文件系统无空间或者无inod…

文件另存为保存:无法在未启用宏的工作簿中保存以下功能,

Wb.DoNotPromptForConvert true; Wb.Application.DisplayAlerts false;

【unity小技巧】Unity人物衣服布料系统的探究 —— Cloth组件

文章目录 一、Cloth组件解释基本介绍出于性能的考虑, 可以对Cloth产生影响的Collider只有两种打开编辑模式绘制 二、基本使用1. 创建出一个空物体2. 在空物体上添加cloth组件&#xff0c;可以直接点击Add Component搜索cloth添加&#xff0c;也可以在工具栏 Component–>phy…

GOWIN软件使用

1、管脚复用 根据自己需求把复用管脚勾选上&#xff0c;管脚当普通管脚使用 JTAG设置成普通管脚&#xff0c;下载程序时候JTAGEN管脚需要上拉高电平&#xff08;可以在下载器线上上拉个电阻&#xff0c;下载后把下载线拔走&#xff0c;否则JTAG管脚无法使用&#xff0c;管脚充…

2010练习题

5&#xff0c; //几个类&#xff08;Vehicle类 Car类 Streetwheel类 Brake类&#xff09;有着必然的联系&#xff0c;设计类与实现 #include<iostream> using namespace std; class Vechile{public:virtual void function() 0; }; class Streetwheel{public:Streetwhee…

基于ACM32 MCU的电动滑板车方案了,助力低碳出行

随着智能科技的快速发展&#xff0c;电动滑板车的驱动系统也得到了长足的发展。国内外的电动滑板车用电机驱动系统分为传统刷式电机和无刷电机两种类型。其中&#xff0c;传统的刷式电机已经逐渐被无刷电机所取代&#xff0c;无刷电机的性能和寿命都更出色&#xff0c;已成为电…

基于C++中netCDF库读取.nc数据时的一些坑

本文介绍基于C 语言的netCDF库读取.nc格式的栅格文件时&#xff0c;出现数据无法读取、数据读取错误、无法依据维度提取变量等情况的原因与解决方法。 最近&#xff0c;由于需要读取ERA5气象数据&#xff0c;因此使用C语言中的netCDF库读取.nc格式文件&#xff1b;这其中也是踩…

Win8.1 连接Wifi后开启热点

1 首先管理员运行 cmd, 输入命令&#xff0c;其中ssid无线名称&#xff0c;key密码&#xff0c;此时网络连接出现 本地连接 2. netsh wlan set hostednetwork modeallow ssidwahahaad key12345678 netsh wlan start hostednetwork 2 找到当前连接的 WLAN, 设置共享。 3 先停止…

纯手工搭建一个springboot maven项目

前言&#xff1a;idea社区版无法自动搭建项目&#xff0c;手动搭建的经验分享如下&#xff1a; 1 包结构 参考下图&#xff1a; 2 项目结构 3 maven依赖 具体的项目包结构如下图&#xff1a; 依据这个项目包结构配置一个springboot 的 pom依赖&#xff1a; <?xml ve…

基于springboot+vue的高校学生党员发展管理系统(源码+论文)

文章目录 目录 文章目录 前言 一、功能设计 二、功能实现 6.1 系统首页界面 6.2 用户登录界面 6.6 管理员后台界面 6.7 学生信息管理界面 6.8 资料管理界面 6.9 入党申请管理界面 6.10 正式党员管理界面 三、库表设计 四、论文 前言 为了进一步加强高校内党组织建设&#xff0c…

ue WebUI插件下载官方Github方法

首先要先将EPIC账号绑定Github账号 这个网上有很多教程 我就不细说了 绑定以后点击这个链接 https://github.com/tracerinteractive/UnrealEngine 进去后是这样的 点击这里 下滑找到对应版本下载即可 好了就这样 别被割韭菜了

《汇编语言》- 读书笔记 - 第17章-使用 BIOS 进行键盘输入和磁盘读写

《汇编语言》- 读书笔记 - 第17章-使用 BIOS 进行键盘输入和磁盘读写 17.1 int9 中断例程对键盘输入的处理键盘缓冲区 17.2 使用 int 16h 中断例程读取键盘缓冲区编程检测点 17.1 17.3 字符串的输入编程&#xff1a;字符串输入程序需求分析处理过程子程序完整代码 17.4 应用 in…

Mybatis-Plus——06,CRUD查

CRUD查 一、普通查询1.1、通过id查询单个用户1.2、通过id查询多个用户1.3、条件查询 通过map封装 二、分页查询2.1、配置分页插件2.2、运行方法 三、通过wrapper条件构造器查询3.1、查询name不为空&#xff0c;email不为空&#xff0c;age大于18的用户3.2、查询nameJone的用户3…

[技术杂谈]解决右键没有vscode打开选项的问题

问题&#xff1a; 点击鼠标右键没有‘使用vscode打开’的选项。 原因&#xff1a; 在安装时没有勾选相关选项 解决办法&#xff1a; 新建一个reg文件写入下面文件&#xff0c;注意替换自己真实Code.exe路径 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\she…

计算机考研❗️这些院校(含985)性价比巨高

✅厦门大学 (985) 不歧视双非&#xff0c;全靠实力&#xff0c;校园环境还贼美 ✅重庆大学 (985) 信息公开透明&#xff0c;复试抽签 ✅北京师范大学 (985) 不歧视本科出身&#xff0c;面试抽签答题。 ✅东南大学 (985) 保护第一志愿&#xff0c;复试抽签 ✅吉林大学 (…

3Dmax中VR渲染太阳光渲染参数怎么设置?渲染100云渲染助力

我们用3Dmax建模时一些场景会用到太阳光&#xff0c;那么渲染参数是如何设置的呢&#xff1f; 我们一起来看看&#xff0c;直接上图 以上就是详细的参数设置&#xff0c;大家可以用做参考&#xff0c;如果本地渲染慢的朋友可以考虑使用云渲染100 机器多&#xff0c;渲染稳定不…

仪酷LabVIEW OD实战(4)——Object Detection+OpenVINO工具包快速实现yolo目标检测

‍‍&#x1f3e1;博客主页&#xff1a; virobotics(仪酷智能)&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f384;所属专栏&#xff1a;『仪酷LabVIEW目标检测工具包实战』 &#x1f4d1;上期文章&#xff1a;『仪酷LabVIEW OD实战(3)——Object Detectiononnx工具包快速…

【新版Hi3521DV200处理器性能】

新版Hi3521DV200处理器性能 Hi3521DV200是针对多路高清/超高清&#xff08;1080p/4M/5M/4K&#xff09;DVR产品应用开发的新一代专业SoC芯片。Hi3521DV200集成了ARM Cortex-A7四核处理器和性能强大的神经网络推理引擎&#xff0c;支持多种智能算法应用。同时&#xff0c;Hi352…

微服务之商城系统

一、商城系统建立之前的一些配置 1、nacos Nacos是一个功能丰富的开源平台&#xff0c;用于配置管理、服务发现和注册、健康检查等&#xff0c;帮助构建和管理分布式系统。 在linux上安装nacos容器的命令&#xff1a; docker run --name nacos-standalone -e MODEstandalone …

在centos7系统中如何给docker配置代理

一、需求场景 生产环境私有云中&#xff0c;通常一个集群的机器中只有几台机器可以直接访问公网&#xff0c;其他机器需要通过代理的方式从能访问公网的机器出去&#xff0c;在已经做了如下配置之后&#xff0c;使用docker pull命令已经报错超时timeout&#xff0c;这时可以尝…