【算法通关】模拟:替换问号、提莫攻击、Z 字形变换、外观数列、数青蛙全解

【算法通关】模拟:替换问号、提莫攻击、Z 字形变换、外观数列、数青蛙全解

文章目录

1. 替换所有的问号

题目链接:1576. 替换所有的问号
题目描述:

在这里插入图片描述

算法思路:
从前向后遍历整个字符串,当遇到?时就从字母a 开始遍历 到z,找到与?前和后不重复的即可。

算法代码:

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

2. 提莫攻击

题目链接:495. 提莫攻击
题目描述:

在这里插入图片描述

算法思路:
模拟题目描述+分情况讨论:计算相邻两个时间点的差值,当差值大于等于中毒时间,说明上次中毒时间可以持续 duration;如果差值小于中毒时间,那么上次的中毒只能持续两者的差值。

算法代码:

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

3. Z 字形变换

题目链接:6. Z 字形变换
题目描述:

在这里插入图片描述


算法思路:
该题的z字形是呈现一个横着的z字。可以找到其中的规律,每一个字符间以2*row-2 的公差进行变换。那么可以得到第一行和最后一行是差为2row-2的等差数列;而中间行也是为该公差的等差数列,但是多了一个数据。而中间行前两个数相加刚好为公差,可以得到 k 行刚好是(k,d-k)的两个等差数列。

算法代码:

publicStringconvert(String s,int numRows){if(numRows ==1)return s;int d =2* numRows -2, n = s.length();StringBuilder ret =newStringBuilder();for(int i =0; i < n; i += d){ ret.append(s.charAt(i));}for(int k =1; k < numRows -1; k++){for(int i = k, j = d - k; i < n || j < n; i += d, j += d){if(i < n) ret.append(s.charAt(i));if(j < n) ret.append(s.charAt(j));}}for(int k = numRows-1; k < n; k += d){ ret.append(s.charAt(k));}return ret.toString();}

4. 外观数列

题目链接:38. 外观数列
题目描述:

在这里插入图片描述


算法思路:
模拟+双指针,依次统计字符中连续相等的字符的个数,right 移动到与left 不相等时,记录right - left 并加上left 的值,然后left 指向right 再继续这个操作即可。

算法代码:

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

5. 数青蛙

题目链接:1419. 数青蛙
题目描述:

在这里插入图片描述

算法思路:
模拟+哈希表,使用数组代替哈希表存放蛙鸣声字符的次数,并且元素与下标进行对应,哈希表中存放元素与对应的下标;遍历字符,当遇到开头元素 c 时,判断哈希表k元素中是否有值,如果有则将k-1表示该青蛙再次鸣叫,且哈希表c+1,没有则只让c+1,当遇到其他roak时,则判断前一个元素下是否有值,没有则返回-1,有则前一个元素–,当前元素++,当遇到k时,让k进行累加,最后返回k下的值即可。

算法代码:

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

Read more

【一天一个计算机知识】—— 【 C/C++ 内存管理与分布】

【一天一个计算机知识】—— 【 C/C++ 内存管理与分布】

⚡ CYBER_PROFILE ⚡ /// SYSTEM READY /// [WARNING]: DETECTING HIGH ENERGY 🌊 🌉 🌊 心手合一 · 水到渠成 >>> ACCESS TERMINAL <<<[ 🦾 作者主页 ][ 🔥 C语言核心 ][ 💾 编程百度 ][ 📡 代码仓库 ] --------------------------------------- Running Process: 100% | Latency: 0ms 索引与导读 * 🚩一、C/C++ 内存分布 * 🚩二、C语言的动态内存管理 * 💪C动态内存管理的面试考点 * 1)realloc的工作机制 * 2)malloc/calloc/realloc的区别是什么? * 🚩三、C++ 动态内存管理 * 1)操作内置类型 * 1.1)单个变量的分配和释放

By Ne0inhk
C++备忘录模式:优雅实现对象状态保存与恢复

C++备忘录模式:优雅实现对象状态保存与恢复

C++备忘录模式:优雅实现对象状态保存与恢复 * 引言 * 备忘录模式概述 * 核心角色解析 * 1. Originator(发起人) * 2. Memento(备忘录) * 3. Caretaker(管理者) * 设计原则体现 * C++实现示例 * 典型应用场景 * 高级特性与优化 * 1. 增量备忘录 * 2. 序列化支持 * 3. 线程安全考虑 * 与其他模式的协作 * 注意事项 * 总结 引言 在软件开发中,我们经常需要实现撤销操作、历史记录或状态回滚等功能。备忘录模式(Memento Pattern)正是为解决这类问题而生的设计模式。本文将深入探讨备忘录模式在C++中的实现与应用,帮助开发者掌握这一强大的设计工具。 备忘录模式概述 备忘录模式是一种行为设计模式,它允许在不破坏封装性的前提下捕获并外部化一个对象的内部状态,以便以后可以将该对象恢复到原先保存的状态【1†source】。该模式特别适合需要实现撤销操作、历史记录或快照功能的场景【1†source】

By Ne0inhk

c++最小生成树详讲

一、最小生成树(Minimum Spanning Tree)是什么? 1️⃣ 图论基础回顾 我们先明确研究对象: * 无向图 * 连通 * 带权图 设图 (G = (V, E)) * (V):点集,(|V| = n) * (E):边集,(|E| = m) * 每条边有权值 (w) 2️⃣ 生成树(Spanning Tree) 定义 一棵 生成树 满足: 1. 包含图中 所有顶点 2. 是一棵 树 * 连通 * 无环 3. 边数一定是: [ |E| = n - 1 ] 👉 一个连通图可能有 很多棵生成树

By Ne0inhk
C++ 入门全指南:从发展史到第一个程序,命名空间 + 输入输出手把手讲

C++ 入门全指南:从发展史到第一个程序,命名空间 + 输入输出手把手讲

目录 一、C++的发展历史 1.发展历史 2.C++的版本更新 3.C++的参考文档 二、C++的学习建议 1.C++的应用领域: 2.学习书籍推荐: 三、C++的第一个程序 四、命名空间 1.namespace的价值: 2.namespace的定义: 1)使用namespace来命名空间,以及使用命名空间(详解见注释): 2)命名空间的嵌套使用 3)多文件定义的命名空间问题 3.namespace命名空间的使用: 1)指定命名空间访问 2)using将命名空间中某个成员展开 3)展开命名空间中全部成员 五、C++输入&输出

By Ne0inhk