【优选算法】模拟算法:替换所有的问号,提莫攻击,N字形变换,外观数列,数青蛙

【优选算法】模拟算法:替换所有的问号,提莫攻击,N字形变换,外观数列,数青蛙

文章目录

1. 替换所有的问号(LC1576)

替换所有的问号

题目描述

在这里插入图片描述

解题思路

按照题目要求,双层循环,外层遍历字符串;内层从a到z依次尝试,与前后不等则填入。

代码实现

publicStringmodifyString(String s){char[] ss = s.toCharArray();int n = ss.length;for(int i =0;i<n;i++){if(ss[i]!='?')continue;for(char ch ='a';ch<='z';ch++)if((i==0|| ch!=ss[i-1])&&(i==n-1||ch!=ss[i+1])){ ss[i]= ch;break;}}returnnewString(ss);}

2. 提莫攻击(LC495)

提莫攻击

题目描述

在这里插入图片描述

解题思路

计算两次“受到攻击”之间的差值x

  • x >= d ,则ret+=d
  • x < d,则ret+=x

最后要加上一个d,表示最后一次“攻击”的时间

代码实现

publicintfindPoisonedDuration(int[] timeSeries,int duration){int ret =0;for(int i =1;i<timeSeries.length;i++){int x = timeSeries[i]-timeSeries[i-1]; ret +=(x>=duration)?duration:x;} ret += duration;return ret;}

3. N字形变换(LC6)

N字形变换

题目描述

在这里插入图片描述

解题思路

  • 解法二:依据模拟过程找规律,把字符的下标模拟到矩阵中:
    • 第0行:公差就是一个周期中字符个数 d = n + n - 2 = 2n - 2
      • 0 -> 0+d -> 0+2d -> 0+3d -> …-> 0+kd
    • 第i行:一个周期内有两个元素
      • i -> i+d -> i+2d -> … -> i+kd
      • d - i -> d - i +d -> d - i + 2d -> … -> d - i + kd
    • 第n-1行:

n-1 -> n-1+d -> n-1+2d -> … ->n-1+kd

在这里插入图片描述

解法一:创建二维数组,按照N形依次填入。时间复杂度和空间复杂度都是字符串长度*numRow

在这里插入图片描述

注意: n=1直接返回原字符串,按照上面的规律会陷入死循环。

代码实现

publicStringconvert(String s,int numRows){if(numRows==1)return s;StringBuilder ret =newStringBuilder();int n = s.length();int d =2*numRows -2;//公差int n1 =(n+d-1)/d;//周期个数,向上取整//第0行for(int k =0;k<n1;k++) ret.append(s.charAt(k*d));//中间行for(int i =1;i<numRows-1;i++){for(int k =0;k<n1;k++){if(i+k*d<n) ret.append(s.charAt(i+k*d));if(d-i + k*d<n) ret.append(s.charAt(d-i + k*d));}}//最后一行for(int k =0;k<n1;k++){if(numRows-1+k*d<n) ret.append(s.charAt(numRows-1+k*d));}return ret.toString();}

4. 外观数列(LC38)

外观数列

题目描述

在这里插入图片描述

解题思路

利用双指针来模拟过程:left,right初始为0

  • right 向右 移动,直到与left指向的字符不同,停止移动
  • right - left就是中间的个数,接着left移动到right的位置,循环这个过程

代码实现

publicStringcountAndSay(int n){String s ="1";for(int i =1;i<n;i++){StringBuilder tmp =newStringBuilder();int len = s.length();int count =0;for(int left =0,right=0; right<len;){while(right<len && s.charAt(left)==s.charAt(right)) right++; tmp.append(String.valueOf(right-left)); tmp.append(s.charAt(left)); left = right;} s = tmp.toString();}return s;}

5. 数青蛙(LC1419)

数青蛙

题目描述

在这里插入图片描述

解题思路

使用哈希表来存c r o a k每个字符:

  • 遇到 r o a k 这四个字符的时候,看每⼀个字符对应的前驱字符,有没有青蛙叫出来。如果有青蛙叫出来,那就让这个青蛙接下来喊出来这个字符;如果没有,直接返回 -1 ;
  • 遇到 c 这个字符的时候,看 ‘k’ 这个字符有没有青蛙叫出来。如果有,就让
    这个青蛙继续去喊 c 这个字符;如果没有,就重新搞⼀个青蛙。

代码实现

publicintminNumberOfFrogs(String c){char[] croakOfFrogs = c.toCharArray();int[] croak =newint[5];String s ="croak";Map<Character,Integer> index =newHashMap<>();for(int i =0;i<5;i++) index.put(s.charAt(i),i);for(char ch:croakOfFrogs){if(ch =='c'){if(croak[4]!=0) croak[4]--; croak[0]++;}else{int i = index.get(ch);if(croak[i-1]!=0){ croak[i-1]--; croak[i]++;}elsereturn-1;}}for(int i =0;i<4;i++){if(croak[i]!=0)return-1;}return croak[4];}

Read more

Linux下安装Docker

目录 1. 确定Linux版本 2.卸载旧版本Docker(可选) 3.安装必要的依赖 4.添加Docker仓库 5.配置 Docker 镜像源(推荐使用阿里云) 6.安装 Docker Engine 7.启动并设置开机自启 8.验证 Docker 安装是否成功 1. 确定Linux版本 新版本的Docker对Linux系统版本有一定的要求。如果Linux的发行版系统是centOS,安装最新版的docker需要centOS 9以上的系统。 ·在Docker安装帮助页面查看支持的系统版本。   Docker帮助页面:https://docs.docker.com/engine/install/centos/ # 查看当前版本 cat /etc/redhat-release 2.卸载旧版本Docker(可选) 如果您之前安装过Docker,建议先卸载旧版本以避免冲突。执行以下命令卸载旧版本的Docker:

By Ne0inhk
一文给傻子讲清网络中的 MAC 地址 是个啥东西

一文给傻子讲清网络中的 MAC 地址 是个啥东西

前言 书接上文的讲清网络名词https://blog.ZEEKLOG.net/m0_61763784/article/details/154519828?fromshare=blogdetail&sharetype=blogdetail&sharerId=154519828&sharerefer=PC&sharesource=m0_61763784&sharefrom=from_link 如果你对上文感兴趣并且看到了小结部分,你就会注意到,小结中有一段你比较陌生的一串字符 这里有一个MAC地址,那这个是什么东西呢?好,本章节就为大家讲解,MAC到底是个啥。 概念铺垫 由前文你应该已经了解了tcp/ip以及各大网络协议名词,还有网络信息流转的基本流程,那有人会好奇 为什么我都有一个IP地址了,我已经有了名字了,我为什么还要一个MAC地址呢? MAC相当于是每一个硬件设备的身份证,在这张身份证上标注了你是一个什么设备(单片机,电脑终端,路由器,

By Ne0inhk
Flutter 三方库 changelog_cli 的鸿蒙化适配指南 - 自动化生成 CHANGELOG、标准化版本管理与工程化协作利器

Flutter 三方库 changelog_cli 的鸿蒙化适配指南 - 自动化生成 CHANGELOG、标准化版本管理与工程化协作利器

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 changelog_cli 的鸿蒙化适配指南 - 自动化生成 CHANGELOG、标准化版本管理与工程化协作利器 前言 在 Flutter for OpenHarmony 的企业级开发流程中,维护一份详实、规范的更新日志(CHANGELOG)是版本控制的核心环节。changelog_cli 是一个专为 Flutter 开发者设计的命令行工具,它能够基于特定的规范自动生成或更新日志。本文将探讨如何将该工具集成到鸿蒙项目的开发流水线中,大幅提升工程化协作效率。 一、原理解析 / 概念介绍 1.1 基础原理 changelog_cli 通过读取项目的 pubspec.yaml 版本信息和特定的配置文件,配合开发者在命令行输入的更新内容,自动拼装成符合 Keep a Changelog 规范的

By Ne0inhk
Linux信号保存的核心:未决信号集与阻塞信号集——探秘内核如何实现信号的阻塞、暂存与派发

Linux信号保存的核心:未决信号集与阻塞信号集——探秘内核如何实现信号的阻塞、暂存与派发

🔥海棠蚀omo:个人主页                 ❄️个人专栏:《初识数据结构》,《C++:从入门到实践》,《Linux:从零基础到实践》                 ✨追光的人,终会光芒万丈 博主简介: 目录 一.信号保存相关的常见概念 二.信号在内核中的表示 三.信号集的具体操作 3.1sigset_t类型 3.2信号集操作函数 3.3 sigprocmask函数 3.4 sigpending函数 四.扩展知识 4.1问题一 4.2问题2 4.3问题3 前言: 我们前面在讲解信号产生的时候,说到进程在收到信号时可能并不会立即处理,既然不会处理那就要将信号保存起来,我们当时只简单讲解了在进程的PCB中会有一个位图来保存信号。 而我们今天就来详细探讨一下关于信号保存方面更为详细的知识。 一.信号保存相关的常见概念 1.实际执⾏信号的处理动作称为信号递达(Delivery)2.

By Ne0inhk