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

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

  • 42.接雨水
  • 13.罗马数字转整数
  • 12.整数转罗马数字
  • 58.最后一个单词长度
  • 14.最长公共前缀

42.接雨水

原题链接 42.接雨水

在这里插入图片描述

在学校的算法小学期做过,做法是基于一个重要的观察:

  • 一列列的看,当前列雨水的高度由,左边最高墙和右边最高墙中的较小值决定

可以预先处理出前缀最大和后缀最大,这样整个做法时间和额外空间复杂度都是 O ( N ) O(N) O(N)

class Solution {
public:
    int trap(vector<int>& height) {
        int len = height.size();
        int leftmax[len],rightmax[len];
        int temp = 0;
        for(int i = 0;i<len;i++) {
            temp = max(temp,height[i]);
            leftmax[i] = temp;
        }
        temp = 0;
        for(int i = len-1;i>=0;i--) {
            temp = max(temp,height[i]);
            rightmax[i] = temp;
        }
        temp = 0;
        for(int i = 1;i < len-1;i++) {
            int wall = min(leftmax[i-1],rightmax[i+1]);
            temp += max(0,wall-height[i]);
        }
        return temp;
    }
};

学习官方题解中给出的单调栈做法:

  • 维护一个单调递减的栈
  • 当新入量比栈顶高时,执行出栈操作
    • 将栈顶出栈,这相当于这段雨水的“底”
    • 此时的栈顶的就是雨水的左边界,即将入栈的新元素为雨水的右边界
    • 判断雨水的宽度: i − l e f t − 1 i-left-1 ileft1
    • 判断雨水的高度: m i n { h i , h l e f t } − h t o p min\{h_i,h_{left}\}-h_{top} min{hi,hleft}htop
class Solution {
public:
    int trap(vector<int>& height) {
        stack<int> st;
        int len = height.size();
        int result = 0;
        for(int i = 0;i < len;i++) {
            while(st.size() && height[i]>height[st.top()]) {
                int t = st.top();
                st.pop();
                if(st.empty()) {
                    break;
                }

                int left_wall = st.top();
                int w = i - left_wall - 1;
                int h = min(height[left_wall],height[i])-height[t];
                result += h*w;
            }
            st.push(i);
        }
        return result;
    }
};

13.罗马数字转整数

原题链接 13.罗马数字转整数

打表

class Solution {
public:
    int romanToInt(string s) {
        int map[26];
        map['V'-'A'] = 5;
        map['L'-'A'] = 50;
        map['D'-'A'] = 500;
        map['M'-'A'] = 1000;

        int N = s.size();
        int ans = 0;
        int i = 0;
        while(i < N) {
            switch(s[i]) {
                case 'I':
                    if(s[i+1] == 'V') {
                        ans += 4;
                        i += 2;
                    } else if(s[i+1] == 'X') {
                        ans += 9;
                        i += 2;
                    }
                    else {
                        ans += 1;
                        i += 1;
                    }
                    break;
                case 'X':
                    if(s[i+1] == 'L') {
                        ans += 40;
                        i += 2;
                    } else if(s[i+1] == 'C') {
                        ans += 90;
                        i += 2;
                    }
                    else {
                        ans += 10;
                        i += 1;
                    }
                    break;
                case 'C':
                    if(s[i+1] == 'D') {
                        ans += 400;
                        i += 2;
                    } else if(s[i+1] == 'M') {
                        ans += 900;
                        i += 2;
                    }
                    else {
                        ans += 100;
                        i += 1;
                    }
                    break;
                default:
                    ans += map[s[i++]-'A'];
                    break;
            }
        }

        return ans;
    }
};

12.整数转罗马数字

原题链接 12.整数转罗马数字

打表

class Solution {
public:
    string getOne(int n) {
        switch(n) {
            case 0: return "";
            case 1: return "I";
            case 2: return "II";
            case 3: return "III";
            case 4: return "IV";
            case 5: return "V";
            case 6: return "VI";
            case 7: return "VII";
            case 8: return "VIII";
            case 9: return "IX";
        }
        return "";
    }
    string getTen(int n) {
        switch(n) {
            case 0: return "";
            case 1: return "X";
            case 2: return "XX";
            case 3: return "XXX";
            case 4: return "XL";
            case 5: return "L";
            case 6: return "LX";
            case 7: return "LXX";
            case 8: return "LXXX";
            case 9: return "XC";
        }
        return "";
    }
    string getHundred(int n) {
        switch(n) {
            case 0: return "";
            case 1: return "C";
            case 2: return "CC";
            case 3: return "CCC";
            case 4: return "CD";
            case 5: return "D";
            case 6: return "DC";
            case 7: return "DCC";
            case 8: return "DCCC";
            case 9: return "CM";
        }
        return "";
    }
    string getThousand(int n) {
        switch(n) {
            case 0: return "";
            case 1: return "M";
            case 2: return "MM";
            case 3: return "MMM";
        }
        return "";
    }
    string intToRoman(int num) {
        int one = num%10;
        int ten = (num/10)%10;
        int hundred = (num/100)%10;
        int thousand = num/1000;
        return getThousand(thousand)+getHundred(hundred)+getTen(ten)+getOne(one);
    }
};

58.最后一个单词长度

原题链接 58.最后一个单词长度

直接从后向前遍历

class Solution {
public:
    int lengthOfLastWord(string s) {
        int len = s.size();
        int result = 0;
        int i;
        for(i = len-1;s[i]==' ';i--);
        for(;i>=0 && s[i] != ' ';i--,result++) ;
        return result;
    }
};

14.最长公共前缀

原题链接 14.最长公共前缀

横向扫描或者正向扫描,暴力


class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        string ans = {};
        int len = strs[0].size();
        int N = strs.size();
        for(int i = 0; i < len;i++) {
            for(int j = 1;j < N;j++) {
                if(strs[j][i] != strs[0][i]) {
                    return ans;
                }
            }
            ans.push_back(strs[0][i]);
        }
        return ans;
    }
};
```

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

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

相关文章

一线大厂软件测试面试题及答案解析,2024最强版...

【软件测试面试突击班】2024吃透软件测试面试最全八股文攻略教程&#xff0c;一周学完让你面试通过率提高90%&#xff01;&#xff08;自动化测试&#xff09; 1、什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台、软件平台上…

Java多线程——如何控制线程顺序执行,如何控制线程同时执行

目录 引出如何控制线程执行顺序&#xff1f;多个线程在某一时刻同时开始执行&#xff1f; Redis冲冲冲——缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Java多线程——如何控制线程顺序执行&#xff0c;如何控制线程同时执行 如何控制线程…

leetcode日记(36)全排列

想思路想了很久……思路对了应该会很好做。 我的思路是这样的&#xff1a;只变化前n个数字&#xff0c;不断增加n&#xff0c;由2到nums.size()&#xff0c;使用递归直到得到所有结果 代码如下&#xff1a; class Solution { public:vector<vector<int>> permut…

枚举——完美立方算法

枚举 基于逐个尝试答案的一种问题求解策略 例如&#xff1a;求小于N的最大素数 找不到一个数学公式&#xff0c;使得根据N就可以计算出这个素数 N-1是素数吗&#xff1f;N-2是素数吗&#xff1f; …… 判断N-i是否是素数的问题 转化成求小于N的全部素数&#xff08;可以用筛法…

Linux:ansible-playbook配置文件(剧本)(进阶)

Linux&#xff1a;ansible-playbook配置文件&#xff08;剧本&#xff09;_ansible-playbook -i参数-CSDN博客https://blog.csdn.net/w14768855/article/details/132579492?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170930036016800215061982%2522%252C%2522s…

flutter学习(一) 安装以及配置环境

首先需要下载flutter&#xff0c;然后解压 然后配置环境变量&#xff0c;配置到bin目录就行 然后在用户变量里再配置一下&#xff08;不配置后来你就知道有多重要了&#xff09; PUB_HOSTED_URL https://pub.flutter-io.cn FLUTTER_STORAGE_BASE_URL https://storage.flut…

【CesiumJS-3】加载倾斜模型数据(3DTilest)以及修改位置

引入倾斜模型数据 // 加载3DTiles数据let tileset;try {tileset await Cesium.Cesium3DTileset.fromUrl("/api/3DTiles/b3dm_qx/tileset.json");viewer.value.scene.primitives.add(tileset); // 倾斜模型添加到场景中viewer.value.zoomTo(tileset); // 视角定位到倾…

Nano 33 BLE Sense Rev2学习第一节——环境配置

参考文档见Access Barometric Pressure Sensor Data on Nano 33 BLE Sense | Arduino Documentation 打开Arduino ide安装开发板 选择开发板 连接开发板到电脑&#xff0c;自动识别开发板端口&#xff0c;选择端口

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:图像效果)

设置组件的模糊、阴影、球面效果以及设置图片的图像效果。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 blur blur(value: number, options?: BlurOptions) 为组件添加内容模糊效果。 卡片能力&am…

电脑提示d3dcompiler_43.dll丢失的解决方法分享,教你4种方法修复

在电脑使用过程中&#xff0c;你可能遇到一个报错通知&#xff0c;系统提示你d3dcompiler_43.dll文件缺失。那么&#xff0c;什么是d3dcompiler_43.dll文件&#xff1f;它有什么作用&#xff1f;如何修复文件缺失的问题呢&#xff1f;本文将为你详细解答&#xff0c;我们会给大…

网络安全知识入门:Web应用防火墙是什么?

在互联网时代&#xff0c;网络安全问题逐渐受到重视&#xff0c;防火墙的配置也是非常必要的。它是位于内部网和外部网之间的屏障&#xff0c;更是系统的第一道防线。Web应用防火墙是什么&#xff0c;如何才能更好地保护Web应用&#xff0c;这篇文章会从应用安全为出发点&#…

【VTKExamples::PolyData】第四十五期 QuantizePolyDataPoints

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例QuantizePolyDataPoints,并解析接口vtkQuantizePolyDataPoints,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~Y…

原牛角源码(修罗bbs)全站程序打包带数据库备份

原牛角源码(修罗bbs)全站程序打包带数据库备份&#xff0c;牛角源码全站数据全站文件、插件打包分享给大家&#xff0c;有兴趣的可以搭建玩玩 源码下载地址专业知识分享社区-专业知识笔记免费分享 (chaobiji.cn)

支持向量机 SVM | 线性可分:硬间隔模型公式推导

目录 一. SVM的优越性二. SVM算法推导小节概念 在开始讲述SVM算法之前&#xff0c;我们先来看一段定义&#xff1a; 支持向量机(Support VecorMachine, SVM)本身是一个二元分类算法&#xff0c;支持线性分类和非线性分类的分类应用&#xff0c;同时通过OvR或者OvO的方式可以应用…

【设计模式】观察者模式及函数式编程的替代C++

本文介绍观察者模式以及使用函数式编程替代简单的策略模式。 观察者模式 观察者模式是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;其所有依赖者都会收到通知并自动更新。 当对象间存在一对多关系时&#…

Java集合框架-Collection和Map

文章目录 Collection-单列集合特点ListArrayListLinkedListVecter SetHashSetTreeSet Map-键值对集合特点Map常用APIput添加细节remove Map的三种遍历方式1.通过键找值2.通过"键值对"3.Lambda表达式foreach源码 HashMap需求 为什么要使用泛型 泛型的优点1.集合中存储…

c4d渲染到一半未响应怎么办?

如果您曾经遇到过 Cinema 4D 在渲染过程中崩溃的令人沮丧的场景&#xff0c;这种情况是很常见的。这种意外的卡顿崩溃&#xff0c;尤其是在经过数小时的精心工作之后&#xff0c;确实令人烦躁。为了帮助您解决此问题&#xff0c;您可以查看一些内容。 1、硬件限制&#xff1a;…

鸿蒙App开发新思路:小程序转App

国家与国家之间错综复杂&#xff0c;在谷歌的安卓操作系统“断供”后&#xff0c;鸿蒙系统的市场化&独立化的道路便显而易见了。 2024年1月18日&#xff0c;华为宣布&#xff0c;不再兼容安卓的“纯血鸿蒙”--HarmonyOS NEXT鸿蒙星河版最终面世&#xff0c;并与2024年Q4正…

C++模板完整版

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right) {int temp left…

BioTech - ADMET的性质预测 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/136438192 ADMET&#xff0c;即 Absorption、Distribution、Metabolism、Excretion、Toxicity&#xff0c;吸收、分布、代谢、排泄、毒性…