【算法通关】模拟:替换问号、提莫攻击、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++ 开发者的救星:vcpkg 极速上手与避坑完全指南

文章目录 * C++ 开发者的救星:vcpkg 极速上手与避坑完全指南 * 1. 为什么你需要 vcpkg?(痛点回顾) * 2. vcpkg 是怎么工作的?(底层逻辑) * 3. 保姆级安装流程(Windows 篇) * 3.1 准备工作(必做) * 3.2 极速安装步骤 * 3.3 环境变量配置(配置一次,受益终身) * 4. 必看!网络代理设置(国内用户最大痛点) * 5. 常用命令速查表 * 6. 项目集成指南(如何用库?) * 场景 A:CMake 项目(Qt Creator / VS Code / CLion)—— **推荐** * 场景 B:

By Ne0inhk
【c++】c++的四种类型转换(static_cast,reinterpret_cast,const_cast,dynamic_cast)

【c++】c++的四种类型转换(static_cast,reinterpret_cast,const_cast,dynamic_cast)

小编个人主页详情<—请点击 小编个人gitee代码仓库<—请点击 c++系列专栏<—请点击 倘若命中无此运,孤身亦可登昆仑,送给屏幕面前的读者朋友们和小编自己! 目录 * 前言 * 一、c语言中的类型转换 * 隐式类型转换 * 强制类型转换 * const常变量的强制类型转换 * 总结 * 二、c++的四种类型转换 * static_cast * reinterpret_cast * const_cast * dynamic_cast * 三、RTTI * 总结 前言 【c++】特殊类的设计(不能拷贝的类,只能在堆/栈上创建对象的类,不能被继承的类,单例模式——饿汉模式、懒汉模式)——书接上文 详情请点击<—— 本文由小编为大家介绍——【c+

By Ne0inhk
C++ 模板编程基础:泛型编程入门与实践

C++ 模板编程基础:泛型编程入门与实践

第33篇:C++ 模板编程基础:泛型编程入门与实践 一、学习目标与重点 * 掌握模板的核心概念、分类(函数模板、类模板)及基本语法 * 理解泛型编程的思想,能够独立编写函数模板和类模板 * 掌握模板的实例化、特化、偏特化等关键技术 * 解决模板使用中的常见问题(类型推导失败、编译错误等) * 结合实际场景运用模板提升代码复用性和灵活性 * 了解模板与STL的关联,为后续STL学习奠定基础 💡 核心重点:模板的语法规则、类型参数与非类型参数的使用、模板特化的应用场景、泛型编程的核心价值 二、模板与泛型编程概述 2.1 什么是泛型编程 泛型编程(Generic Programming)是一种代码复用技术,核心思想是“编写与类型无关的通用代码,在使用时再指定具体类型”,实现“一次编写,多次复用”。 🗄️ 生活中的泛型类比: * 快递盒:同一个快递盒(通用容器)可装手机、书籍、衣物(不同类型数据)

By Ne0inhk