剑指 Offer 第13天 第14天

news2024/11/16 6:31:32

目录

 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

剑指 Offer 57. 和为s的两个数字

剑指 Offer 58 - I. 翻转单词顺序

剑指 Offer 12. 矩阵中的路径

面试题13. 机器人的运动范围


 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。

示例:

输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。

【解法一】新建一个数组,先遍历一遍,把奇数尾删入数组,在遍历一遍,偶数入数组

【解法二】双指针(一定要保证元素访问有效)

class Solution {
public:
    vector<int> exchange(vector<int>& nums) {
        int left = 0;
        int right = nums.size()-1;
        while(left<right)
        {
            while(left<right && nums[left]%2==1)
            left++;
            while(left<right && nums[right]%2==0)
            right--;
            swap(nums[left++],nums[right--]);
        }
        return nums;
    }
};

剑指 Offer 57. 和为s的两个数字

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

【解法一】哈希访问 直接被我自己笑死,哈哈哈哈哈

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int>res;
        map<int,int> mp;
        for(auto &e : nums)
        {
            if(mp[target-e])
            {
                res.push_back(e);
                res.push_back(target-e);
                return res;
            }
            mp[e]++;
        }
        return res;
    }
};

【解法二】通过一次遍历每个元素,通过target与每个元素的差值进行二分查找

class Solution {
public:
    bool find(vector<int>& nums, int start, int target)
    {
        int end = nums.size();
        while(start < end)
        {
            int mid = (start+end)/2;
            if(target > nums[mid])
            start = mid + 1;
            else if(target < nums[mid])  //整一个二分,
            end = mid;
            else
                return true;
        }
        return false;
    }
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> res;
        for(int i = 0; i < nums.size(); i++)
        {
            int findnum = target - nums[i];  // 利用单值二分查找
            if(find(nums, i, findnum))
            {
                res.push_back(nums[i]);
                res.push_back(findnum);
                return res;
            }
        }
        return res;
    }
};

【解法三】这个解法和那个二维数组的查找很相似呀,换成一维的……

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> res;
        int left = 0, right = nums.size()-1;
        while(left < right)
        {
            int add = nums[left]+nums[right];
            if(add < target)
                left++;
            else if(add > target)
                right--;
            else
            {
                res.push_back(nums[left]);
                res.push_back(nums[right]);
                return res;
            }
        }
        return res;
    }
};

剑指 Offer 58 - I. 翻转单词顺序

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/fan-zhuan-dan-ci-shun-xu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

【解法一】stringsteam的使用

class Solution {
public:
    string reverseWords(string s) {
        stringstream sstream(s);
        // 使用stringstream来接收
        string res;
        while(sstream)
        {
            string tempnull(" ");
            string temp;
            sstream>>temp;  //每次接收一个单词
            res.insert(0, temp);    //头插该单词
            res.insert(0, tempnull);    //再头插一个空格
        }
        res.erase(0, 2);
        return res;
    }
};

剑指 Offer 12. 矩阵中的路径

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ju-zhen-zhong-de-lu-jing-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

【解法一】dfs

int nextP[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
class Solution {
public:
    bool flag = false;
    void dfs(vector<vector<char>>& board, string& word, vector<vector<bool>>& book, 
             int row, int col, int curX, int curY, int wordindex)
    {
        if(wordindex == word.size())
        {
            flag = true;
        }
        for(int i = 0; i < 4; i++)
        {
            int newX = curX + nextP[i][0];
            int newY = curY + nextP[i][1];
            if(newX<0||newX>=row
            || newY<0||newY>=col)
                continue;
            if(book[newX][newY]==false && word[wordindex]==board[newX][newY])
            {
                book[curX][curY] = true; // 这次的dfs吸取教训只修改了值没有进行还原
                dfs(board, word, book, row, col, newX, newY, wordindex+1);
                book[curX][curY] = false; // fds回溯时一定要还原状态;
            }
        }
    }
    bool exist(vector<vector<char>>& board, string word) {
        int row = board.size();
        int col = board[0].size();
        for(int i = 0; i < row; i++)
        {
            for(int j = 0; j < col; j++)
            {
                if(board[i][j] == word[0])
                {
                    vector<vector<bool>> book(row, vector<bool>(col, false));
                    dfs(board, word, book, row, col, i, j, 1);
                    if(flag)
                        return true;
                }
            }
        }
        return false;
    }
};

面试题13. 机器人的运动范围

地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?

【解法一】BFS   不要使用自己已经修改过得变量……


struct Node
{
    int x;
    int y;
    Node(int a, int b)
    {
        x = a;
        y = b;
    }
};
class Solution {
public:
    int count = 0;
    int nextP[2][2] = {{0,1},{1,0}}; // 此题可以省略为俩个方向
    int movingCount(int m, int n, int k) {
        queue<Node>q;
        q.push(Node(0,0));
        vector<vector<bool>> book(m, vector<bool>(n,false));
        book[0][0] = true;
        while(!q.empty())
        {
            Node cur = q.front();
            q.pop();
            int i = cur.x, j = cur.y;
            int add = 0;
            while(i)
            {
                add += i%10;
                i /= 10;
            }
            while(j)
            {
                add += j%10;
                j /= 10;
            }
            if(add <= k)
                count++;
            else
                continue;
            for(int z = 0; z < 2; z++)
            {
                int newX = cur.x + nextP[z][0];
                int newY = cur.y + nextP[z][1];
                if(newX<0||newX>=m
                || newY<0||newY>=n)
                    continue;
                if(book[newX][newY]==false)
                {
                    q.push(Node(newX, newY));
                    book[newX][newY] = true;
                }
            }
        }
        return count;
    }
};

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

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

相关文章

maven基础-关于什么是maven、如何安装以及在Eclipse中的使用等等

本文是向大家介绍项目管理工具maven的基础使用&#xff0c;它能够实现项目构建打包共享&#xff0c;能够实现自动清理、编译、测试、报告等提高开发效率。一、为什么使用Maven这样的构建工具【why&#xff1f;】二、maven是什么【what&#xff1f;】三、安装maven四、第一个mav…

SpringCloud_02

注意&#xff1a; spring:application:name: userserviceprofiles:active: devcloud:nacos:server-addr: localhost:8848config:file-extension: yaml这里的name如果对应的nacos只有默认的命名空间&#xff0c;就直接写入服务名&#xff0c; 如果有其他的命名空间&#xff0c;…

windows 10使用Pycharm从0到1搭建一个QQ聊天机器人

文章目录选择Python环境安装nb-cli配置Go-cqhttp大工告成&#xff01;选择Python环境 Nonebot2官方说&#xff0c;python版本要大于3.8&#xff0c;推荐大家使用虚拟环境&#xff0c;在Poetry、venv、Conda选择一个自己熟悉的即可。 安装nb-cli pip install -i https://pypi…

2-3-1-1、MySQL相关变种及体系结构

目录与MySQL有关的数据库DrizzleMariaDBPercona ServerPostgre SQLSQLiteMySQL体系结构简介连接池管理工具和服务SQL 接口解析器存储引擎、文件系统连接层Server层&#xff08;SQL处理层&#xff09;缓存缓存弃用的原因存储引擎层MySQL 官方引擎概要InnoDB 存储引擎MylSAM 存储…

Linux常用命令——rexec命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) rexec 运程执行Linux系统下命令 补充说明 rexec命令用于在指定的远程Linux系统主机上执行命令&#xff0c;向远程rexec服务器发出执行命令的请求。 rexec命令通过检查$HOME/.netrc文件&#xff08;包含远程主机…

安装NLTK出现11004和11006错误

出现11404的错误 原因是因为访问github的ip地址出现错误 解决方案&#xff1a; 打开C:->Windows->System32->drivers->etc->host, 打开host文件。 在文件最后添加185.199.108.133 raw.githubusercontent.com&#xff0c;即可解决 可以查看raw.githubusercont…

Sublime Text运行C和C++程序

Sublime Text 是一款当下非常流行的文本编辑器&#xff0c;其功能强大&#xff08;提供有众多的插件&#xff09;、界面简洁、还支持跨平台使用&#xff08;包括 Mac OS X、Linux 和 Windows&#xff09;。 在程序员眼中&#xff0c;Sublime Text 不仅仅是一个文本编辑器&…

文本处理以及求相似度

常规操作。先读取文档 ## 1. 分词 &#xff0c; 清洗关键词&#xff0c; # # 删除 特殊字符 # PATTERN r[?|$|&|*|%||(|)|~] # text re.sub(PATTERN, r, text)# string manipulation libs import re import string import nltk from nltk.corpus impor…

Eureka、Ribbon、Nacos之初识微服务(一)

一.微服务技术栈二.服务架构1.1单体架构1.2分布式架构1.3微服务技术对比1.4服务提供者与消费者&#xff08;相对&#xff09;服务提供者:暴露接口给其它微服务调用服务消费者:调用其它微服务提供的接口提供者与消费者角色其实是相对的三.Eureka注册中心1.1Eureka的作用Eureka自…

美团动态线程池实践思路,开源了

背景 「使用线程池 ThreadPoolExecutor 过程中你是否有以下痛点呢&#xff1f;」 ❝ 1.代码中创建了一个 ThreadPoolExecutor&#xff0c;但是不知道那几个核心参数设置多少比较合适 2.凭经验设置参数值&#xff0c;上线后发现需要调整&#xff0c;改代码重启服务&#xff0c;…

java职工工资管理系统(GUI+无数据库)使用java制作

当年大一的课程设计,欢迎大家参考借鉴! 二、系统实现 1.登录界面 创建容器,把相应得组件设置后放入容器。如:密码、文本框、用户、按钮等组件。 设置组件位置使其更加美观(如下图)。账号:root 密码:123 2.系统界面 在查询窗口输入工号,监听模块识别并在文件内查找与工…

部署 KubeEdge 及简单使用

版本说明 k8s版本&#xff1a;1.22.3 kubeedge&#xff1a;1.10.0 kubernetes 集群准备 [roothadoop03 kubeedge]# kubectl get nodes NAME STATUS ROLES AGE VERSION hadoop03 Ready control-plane,master 9d v1.22.3cloudcore k…

电脑c盘空间不足如何清理空间,c盘清理的方法

关于电脑c盘空间不足&#xff0c;相信是很多人所头疼的问题吧&#xff0c;随着电脑使用次数的增加&#xff0c;那c盘的空间越来越少&#xff0c;一直到完全变红&#xff0c;电脑也变得越来越卡&#xff0c;那么我们要怎么去解决呢&#xff1f;电脑c盘空间不足如何清理空间&…

【Go】基于telegraf进行自定义插件开发(一)

基于telegraf进行插件的自定义&#xff08;一&#xff09;前言正文环境准备目录结构插件结构示例代码注册插件结语前言 以长期使用Prometheus和各种exporter的经验来说&#xff0c;大量的exporter会占用物理机的端口资源&#xff0c;虽说这不是特别严重的问题&#xff0c;但是…

【生物信息学】基于SparCC, MENA, LSA, CoNet构建微生物相互作用网络

基于SparCC, MENA, LSA, CoNet构建微生物相互作用网络背景介绍网络推断技术用于宏基因组学及其存在的问题实现方法和工具SparCCMENALSACoNetSPIEC-EASI总结参考资料背景介绍 微生物之间的共现(Co-occurrence)可能有以下几种原因&#xff0c;它们可能具有一定的生态关系&#x…

视频转换成gif动图如何操作?教你三步完成视频转gif

现在网络上流行的gif动图最常见的就是从用电影、电视剧等短视频中截取出来的画面做成gif动画。大家看到这些gif动图一定觉得使用视频转gif&#xff08;https://www.gif.cn/&#xff09;制作非常的复杂麻烦吧&#xff01;其实&#xff0c;想要利用视频截取gif动画非常的简单。给…

Linux mysql安装

1、软件下载1.1、下载地址&#xff1a;https://www.mysql.com/2、Linux 查看centos版本&#xff08;用于mysql版本选择&#xff09;2.1、先使用 yum 安装 redhat-lsb&#xff1a;yum install -y redhat-lsb2.2、安装完成后&#xff0c;使用 -a 查看&#xff1a;lsb_release -a3…

前端必知:如何判断元素出现在视口内(性能优化涉及)

要检测一个元素是否可见或者两个元素是否相交的需求场景有这些&#xff1a; 图片懒加载——当图片滚动到可见时才进行加载内容无限滚动——也就是用户滚动到接近内容底部时直接加载更多&#xff0c;而无需用户操作翻页&#xff0c;给用户一种网页可以无限滚动的错觉检测广告的…

ABB机器人通过直接输入法设置工具坐标系的具体方法和步骤

ABB机器人通过直接输入法设置工具坐标系的具体方法和步骤 为什么要设置工具坐标系? 对于机器人来说,承受的负荷不同,各轴电机输出的电流和扭矩都会不同,错误地选用工具坐标系会导致机器人各轴机械部位的加速磨损,严重的可能会损坏机器人核心减速机等部件。 对于形状规则或…

【每日一题Day103】LC1669合并两个链表 | 模拟

合并两个链表【LC1669】 You are given two linked lists: list1 and list2 of sizes n and m respectively. Remove list1’s nodes from the ath node to the bth node, and put list2 in their place. The blue edges and nodes in the following figure indicate the resul…