Java模拟算法题目练习

Java模拟算法题目练习

模拟算法

模拟算法就是根据其题目进行一步一步操作即可,相对而言较简单,但是边界情况要处理好(细节问题)

替换所有的问好

在这里插入图片描述
题目解析:将s字符串中的?全部替换成小写字母,并且替换?的字符不可以与原本?相邻的两个字符相等
模拟:只需要根据题目条件,找出所有?,并将其替换成符合要求的小写字母即可
在这里插入图片描述
classSolution{publicStringmodifyString(String ss){//替换问好,但是相邻的不可以重复int n = ss.length();char[] s = ss.toCharArray();for(int i =0; i < n;i++){if(s[i]=='?'){//找一个符合条件的字母替换for(char ch ='a'; ch <'z';ch++){//注意?在最左边和最右边这两个边界情况if((i==0|| s[i-1]!= ch)&&(i == n-1|| s[i+1]!= ch)){ s[i]= ch;break;}}}}returnString.valueOf(s);}}
时间复杂度:O(n)
空间复杂度:O(n)

提莫攻击

在这里插入图片描述
题目解析:提莫会对艾希释放技能,让艾希处于中毒状态,求出中毒的总时间
模拟:会出现一次技能持续时间还没有结束,又释放了一个技能
因此我们要判断相邻两次释放技能时间差值与技能持续时间进行对比
如果差值大于或者等于技能持续时间,总时间就加上duration
反之,总时间就加上差值
但是这加上的都是上一次技能的持续时间,因此最后要加上duration,因为最后一次技能肯定会执行完
在这里插入图片描述
classSolution{publicintfindPoisonedDuration(int[] timeSeries,int duration){//判断这次攻击与上次攻击的时间差值即可//差值 >= duration,上一次执行时间为duration//反之 < duration, 上一次执行的时间就是差值int sum =0;for(int i =1;i < timeSeries.length;i++){int x = timeSeries[i]- timeSeries[i -1];if(x >= duration){ sum += duration;}else{ sum += x;}}//加上最后一次技能的持续时间return sum + duration;}}
时间复杂度:O(n)
空间复杂度:O(1)

Z字形变换

在这里插入图片描述
题目解析:给一个字符串,输出其Z字形转换后,按行放入一个新的字符串中返回
模拟:可以直接将其全部字符按照Z字形放到二维矩阵中,并遍历即可,但是时间复杂度和空间复杂度较高,因此我们看看可以找规律吗
在这里插入图片描述
在这里插入图片描述
此时要注意当n = 1时候,其可能会死循环,因此要判断一下
classSolution{publicStringconvert(String s,int numRows){if(numRows <2){return s;}int n = s.length();//公差int d =2*numRows -2;StringBuffer ret =newStringBuffer();//第一行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 - i;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 i = numRows-1;i < n;i += d){ ret.append(s.charAt(i));}return ret.toString();}}
时间复杂度:O(n)
空间复杂度:O(n)

外观数列

在这里插入图片描述
题目解析:就是有很多行的字符串,每一行字符串都是解释的上一行字符串,找出第n行字符串
模拟+双指针
在这里插入图片描述
classSolution{publicStringcountAndSay(int n){//一直解释,解释到第n行String ret ="1";for(int i =1; i < n;i++){//存放当前这一行的解释StringBuilder tem =newStringBuilder();//当前行的长度int len = ret.length();//开始解释for(int left =0,right =0;right < len;){while(right < len&&ret.charAt(left)== ret.charAt(right)){ right++;//直到不相同为止} tem.append(Integer.toString(right - left)); tem.append(ret.charAt(left)); left = right;} ret = tem.toString();}return ret;}}

数青蛙

在这里插入图片描述
题目解析:给了一个字符串,求最小青蛙数量,这里完整的croak才是哇叫,如果存在不完整的就返回-1
模拟+哈希表
因此每次遍历到那个字符都要判断其前驱字符是否存在
使用一个数组放croak对应元素个数
因为这里要找前驱,所以一个哈希表,存放croak这些字符对应下标关系,这样可以对应到上面数组中个数
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
可以直接使用5个变量记录这个字符出现的个数,不断if else即可
classSolution{publicintminNumberOfFrogs(String croakOfFrogs){if(croakOfFrogs.length()%5!=0){return-1;}int c =0;int r =0;int o =0;int a =0;int k =0;int ret =0;for(int i =0; i < croakOfFrogs.length(); i++){char ch = croakOfFrogs.charAt(i);//每次都哟啊判断其前驱字符个数if(ch =='c'){//判断又没有青蛙叫完,有的话就可以从后面直接调取即可if(k >0){--k;++c;}else{++c;}}elseif(ch =='r'){if(c ==0){return-1;}else{--c;++r;}}elseif(ch =='o'){if(r ==0){return-1;}else{--r;++o;}}elseif(ch =='a'){if(o ==0){return-1;}else{--o;++a;}}else{if(a ==0){return-1;}else{--a;++k;}}}if(c!=0||r!=0||o!=0||a!=0){return-1;}return k;}}
使用数组存放对应数量,哈希表来对应下标关系
classSolution{publicintminNumberOfFrogs(String croakOfFrogs){//使用数组模拟哈希String t ="croak";int n = t.length();int[] hash =newint[n];//存放对应元素个数//使用哈希表来映射他们的下标Map<Character,Integer> map =newHashMap<>();//先放入哈希中for(int i =0;i < n;i++){ map.put(t.charAt(i),i);}//此时就要开始判断for(char ch : croakOfFrogs.toCharArray()){//如果是c字符要进行判断,k是否存在if(ch == t.charAt(0)){if(hash[n-1]!=0){ hash[n-1]--;} hash[0]++;}else{//中间字符//因为要判断前驱字符,这里要获取下标int index = map.get(ch);if(hash[index -1]==0){return-1;}else{ hash[index-1]--; hash[index]++;}}}//最后要判断其除了k字符,前面字符是否还有for(int i =0;i < n-1;i++){if(hash[i]!=0){return-1;}}return hash[n-1];}}

Read more

Flutter 组件 humanize 的适配 鸿蒙Harmony 深度进阶 - 驾驭多语言复数逻辑算法、实现鸿蒙端中式大额单位感知与极致人性化文本渲染方案

Flutter 组件 humanize 的适配 鸿蒙Harmony 深度进阶 - 驾驭多语言复数逻辑算法、实现鸿蒙端中式大额单位感知与极致人性化文本渲染方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 humanize 的适配 鸿蒙Harmony 深度进阶 - 驾驭多语言复数逻辑算法、实现鸿蒙端中式大额单位感知与极致人性化文本渲染方案 前言 在前文我们掌握了 humanize 进行基础数据转换的方法。但在鸿蒙(OpenHarmony)面向全球市场的布局中,真正的技术挑战往往隐藏在极其琐碎的“语言表达”中。例如:在英文中我们说 1 items 是错误的,必须是 1 item 与 2 items;而在中文环境下,我们虽然没有复数形变,但却有“万、亿”这类独特的四位一级计数逻辑。 一个真正具备“高级感”的鸿蒙应用,不应在数据展示上显得僵硬且带有明显的机器翻译痕迹。 本文将作为 humanize 适配的进阶篇,带你攻克多语言复数(Pluralization)

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 directed_graph 在鸿蒙应用中优雅处理复杂的拓扑排序与依赖关系(算法级工具)

Flutter for OpenHarmony: Flutter 三方库 directed_graph 在鸿蒙应用中优雅处理复杂的拓扑排序与依赖关系(算法级工具)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 的复杂业务逻辑设计时,我们经常会遇到“依赖关联”问题。例如: 1. 任务调度:任务 A 依赖于任务 B 和 C,任务 B 依赖于 D。你应该按什么顺序运行它们? 2. 数据流建模:在鸿蒙分布式节点中,数据是如何从一个端点流向另一个端点的?是否存在循环引用(Cycle)? 3. 资源加载器:一个大型鸿蒙 HAP 包内的资源加载优先级排序。 directed_graph 是一款纯粹的、算法级别的 Dart 库。它提供了标准的数据结构模型,能帮你极其高效地处理这些复杂的拓扑(Topology)关系。 一、有向图逻辑模型 该库支持对图节点进行深度遍历、

By Ne0inhk

Docker一站式部署:RustFS、GoFastDFS、Gitea与PostgreSQL实战指南

1. 前言 在现代软件开发和部署中,Docker已成为不可或缺的工具。它提供了轻量级、可移植的容器化解决方案,使应用部署变得简单高效。本文将详细介绍如何使用Docker一键部署四个常用服务:RustFS(高性能文件存储)、GoFastDFS(分布式文件系统)、Gitea(自托管Git服务)和PostgreSQL(关系型数据库)。无论你是个人开发者还是团队负责人,这些服务都能为你的项目提供强大支持。 2. 前提条件 * 已安装Docker(版本20.10+) * 已安装Docker Compose(版本1.29+) * 64位操作系统(Windows/Linux/Mac) * 至少4GB可用内存 3. RustFS部署 RustFS是一款使用Rust语言编写的高性能文件存储系统,支持S3协议,适用于私有云存储场景。 3.1 Docker命令部署 Linux: docker run -d \ --name rustfs_container \ --user root \ -p

By Ne0inhk
解密链表环的起点:LeetCode 142 题

解密链表环的起点:LeetCode 142 题

解密链表环的起点:LeetCode 142 题 * 视频地址 * 🌟 引言 * 🔍 问题描述 * 🧠 解题思路回顾 * 快慢指针算法 * 数学原理 * 💻 C++代码实现 * 🛠 代码解析 * 数据结构定义 * 算法实现细节 * 🚀 性能分析 * 🐞 常见问题与调试 * 常见错误 * 调试技巧 * 📊 复杂度对比表 * 🌈 总结 视频地址 因为想更好的为大佬服务,制作了同步视频,这是Bilibili的视频地址 🌟 引言 链表环检测问题在C++中同样是一个经典面试题。本文将用C++实现LeetCode 142题"环形链表II"的解决方案,深入讲解快慢指针算法的原理和实现细节。 🔍 问题描述 给定一个链表的头节点 head,返回链表开始入环的第一个节点。如果链表无环,则返回 nullptr。 🧠 解题思路回顾 快慢指针算法 1. 使用两个指针:slow每次走一步,fast每次走两步 2.

By Ne0inhk