字符的统计——423、657、551、696、467、535

423. 从英文中重建数字

最初思路

首先要有一个指针,对于3/4/5为一组地跳跃。起初想的是后瞻性,如果符合0-9任意,则更换index、跳跃。此时写了一个函数,用来判断s的截取段和0-9中有无符合。这个思路并没有进行下去,虽然可行,但满地补丁、没有美感,代码量和耗时耗空间量实在太大了。

顺便一提,除了two和six的ascii码量相同外,其他的都各自不同。也可以通过这个来比较,额外判断一下是two还是six。

    boolean isMatch(String s,String t){int lenS = s.length();int lenT = t.length();if(lenS!=lenT){return false;}else{IntStream S =  s.codePoints().sorted();IntStream T = t.codePoints().sorted();if(S.allMatch((IntPredicate) T)){return true;}else{return false;}}}

解法一、独特标识 

计数每个字母的出现次数。使用唯一标识符来确定每个数字的数量。例如,"z" 只出现在 "zero" 中,所以可以用它来确定 0 的数量。逐步减少每个字母的计数,直到恢复所有的数字。

其余见注释,digitOrder里取出偶数放前面很重要

class Solution {public String originalDigits(String s) {// 数字单词与其唯一标识符String[] digits = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};char[] uniqueChars = {'z', 'o', 'w', 't', 'u', 'f', 'x', 's', 'g', 'i'};int[] digitOrder = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9};//02468是具有唯一标识符的数字,奇数是除去前面后有唯一标识符的数字,所以处理顺序自动去了冗余。这里其实有表驱动思想。int[] charCount = new int[26]; // 记录每个字母的出现次数for (char c : s.toCharArray()) {charCount[c - 'a']++;}int[] digitCount = new int[10];//数字的出现计数for (int i = 0; i < 10; i++) {int digit = digitOrder[I];//判断数字char uniqueChar = uniqueChars[digit];//取特殊符int count = charCount[uniqueChar - 'a'];//count标识出现了几次digitCount[digit] = count;//最后计数for (char c : digits[digit].toCharArray()) {//也是表驱动。对于该单词,出现次数里减掉它的所有。charCount[c - 'a'] -= count;}}StringBuilder result = new StringBuilder();//把数字按升序加进去for (int i = 0; i < 10; i++) {while (digitCount[i]-- > 0) {result.append(i);}}return result.toString();}
}

657. 机器人能否返回原点

解法一、x、y坐标模拟

也就是说要模拟机器人移动。面朝方向无所谓,只需要考虑坐标。但是如果模拟二维数组,空间耗费太大了,它实则只需要考虑x坐标和y坐标。不妨直接设俩坐标,判断改换完在不在原点。

本质上是字符统计问题。即R、L出现的次数一致,U、D出现的次数一致。

class Solution {public boolean judgeCircle(String moves) {int len = moves.length();int x = 0;int y = 0;if(len % 2 == 1){//如果是奇数,那么直接返回。return false;}for(int i = 0; i< len;i++){switch (moves.charAt(i)){case'R':x++;break;case'L':x--;break;case'U':y--;break;case'D':y++;break;}}if(x == 0 && y==0){return true;}else{return false;}}
}

551. 学生出勤记录 I

解法一、遍历按条件求解

只需要考虑A和L的情况,分别是计数和后视两位

class Solution {public boolean checkRecord(String s) {int len = s.length();int countA = 0;//记录缺勤次数for(int i = 0;i < len;i++){if(s.charAt(i) == 'A'){countA++;if(countA >1){return false;}}else if(s.charAt(i) == 'L' && len - i > 2){if(s.charAt(i+1) == 'L' && s.charAt(i+2) == 'L'){return false;}}}return true;}
}

解法二、api战士

A第一次出现的下标与最后一次出现的下标比较,并判断是否含有LLL

class Solution {public boolean checkRecord(String s) {return (s.indexOf('A')==s.lastIndexOf('A')) && (!s.contains("LLL"));}
}


696. 计数二进制子串

解法一、分组统计,取最小值

感觉也是脑筋急转弯题。不像简单的。

如"001110",分组统计为231,取2和3的最小2,取3和1的最小1,2+1=3个最小子串

class Solution {public static int countBinarySubstrings(String s) {int len  = s.length();int count = 1;if(len == 1)return 0;List<Integer> counts = new ArrayList<>();for(int i = 1;i<len;i++){if(i < len &&s.charAt(i-1) == s.charAt(i)){count++;}else{counts.add(count);count = 1;}}counts.add(count);int sum = 0;for (int i = 1; i < counts.size(); i++) {sum += Math.min(counts.get(i - 1), counts.get(i));}return sum;}
}

解法一的优化版本

对于counts[i],我们只需要和上一个进行比较。所以可以优化掉counts

class Solution {public int countBinarySubstrings(String s) {int ptr = 0, n = s.length(), last = 0, ans = 0;while (ptr < n) {char c = s.charAt(ptr);int count = 0;while (ptr < n && s.charAt(ptr) == c) {++ptr;++count;}ans += Math.min(count, last);last = count;}return ans;}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/count-binary-substrings/solutions/367704/ji-shu-er-jin-zhi-zi-chuan-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解法二、找"01""10"然后向外扩展

int countBinarySubstrings(string s)
{int i = 0, l = s.size(), sum = 0;while (i < s.size() - 1){if ((s[i] == '0' && s[i + 1] == '1') || (s[i] == '1' && s[i + 1] == '0')){char lov = s[i], hiv = s[i + 1];int lo = i - 1, hi = i + 2;sum++;while (lo >= 0 && hi <= l - 1){if (s[lo] == lov && s[hi] == hiv)sum++;elsebreak;lo--, hi++;}}i++;}return sum;
};

467. 环绕字符串中唯一的子字符串

解法一、动态规划

这个完全没做出来!所以看了题解

感慨一下1或者-25能够这么写好巧妙(a-z是-25,其余是1)

class Solution {public int findSubstringInWraproundString(String p) {int[] dp = new int[26];//26个字母的最大子串数int k = 0;for (int i = 0; i < p.length(); ++i) {if (i > 0 && (p.charAt(i) - p.charAt(i - 1) + 26) % 26 == 1) { // 字符之差为 1 或 -25++k;//计数} else {k = 1;//重置k}dp[p.charAt(i) - 'a'] = Math.max(dp[p.charAt(i) - 'a'], k);//取最大值}return Arrays.stream(dp).sum();//返回求和(也是很巧妙的写法,转为输入流}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/unique-substrings-in-wraparound-string/solutions/1514359/huan-rao-zi-fu-chuan-zhong-wei-yi-de-zi-ndvea/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

535. TinyURL 的加密与解密

解法一、不讲武德

双百通关。本来就是想试试,没想到真可以。假如人与人之间多一点信任。。

public class Codec {// Encodes a URL to a shortened URL.public String encode(String longUrl) {return longUrl;}// Decodes a shortened URL to its original URL.public String decode(String shortUrl) {return shortUrl;}
}

 解法二、哈希表+独特标识

自设一个id

public class Codec {private Map<Integer, String> dataBase = new HashMap<Integer, String>();private int id;public String encode(String longUrl) {id++;dataBase.put(id, longUrl);return "http://tinyurl.com/" + id;}public String decode(String shortUrl) {int p = shortUrl.lastIndexOf('/') + 1;int key = Integer.parseInt(shortUrl.substring(p));return dataBase.get(key);}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/encode-and-decode-tinyurl/solutions/1630074/tinyurl-de-jia-mi-yu-jie-mi-by-leetcode-ty5yp/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解法三、哈希生成

将哈希值作为 longUrl 的 key,将键值对 (key,longUrl) 插入数据库 dataBase,然后返回带有 key 的字符串作为 shortUrl。UrlToKey用来避免相同字符串反复哈希冲突的情况

其实相当于对二的id加密。以下是哈希函数

Hash(longUrl)=(∑i=0n−1​longUrl[i]×k1i​)modk2​

public class Codec {static final int K1 = 1117;static final int K2 = 1000000007;//两个合适的质数private Map<Integer, String> dataBase = new HashMap<Integer, String>();
//用来存private Map<String, Integer> urlToKey = new HashMap<String, Integer>();
//public String encode(String longUrl) {if (urlToKey.containsKey(longUrl)) {//如果已经有了,那么return "http://tinyurl.com/" + urlToKey.get(longUrl);}int key = 0;long base = 1;for (int i = 0; i < longUrl.length(); i++) {//哈希函数char c = longUrl.charAt(i);key = (int) ((key + (long) c * base) % K2);base = (base * K1) % K2;}while (dataBase.containsKey(key)) {//如果冲突,则加一key = (key + 1) % K2;}dataBase.put(key, longUrl);//存储urlToKey.put(longUrl, key);//反向存储return "http://tinyurl.com/" + key;}public String decode(String shortUrl) {int p = shortUrl.lastIndexOf('/') + 1;int key = Integer.parseInt(shortUrl.substring(p));return dataBase.get(key);}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/encode-and-decode-tinyurl/solutions/1630074/tinyurl-de-jia-mi-yu-jie-mi-by-leetcode-ty5yp/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

碎碎念

  • 几乎每道题都需要简化/找到独特的基准标识。要么独特标识(423),要么分组讨论(696)本质上是遍历→模拟情况、取出需要的信息
  • 学会了Array.stream、一些字符串api的用法,了解到了一点动态规划

昨天挺累的,恰逢周日,就放了一天假,今天写起来果然舒服多了。果然人还是得放过自己jpg每天都能打卡固然很厉害,断了一天后没彻底摆烂也很重要啊!共勉~

六道题写了两小时一刻钟,其中还有不少是看了题解。

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

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

相关文章

昇思25天学习打卡营第九天|本地安装mindspore之一|Linux的系统在vmware上的安装以及mindspore的安装

课程已经学完了&#xff0c;打算再深入一些。初步的想法是&#xff0c;在本地安装&#xff0c;本地执行。 根据老师的指引&#xff0c;MindSpore官网&#xff0c;“https ://www.mindspore.cn/install/”&#xff0c;注意&#xff0c;因为csdn博客编辑器的原因&#xff0c;当我…

软考:软件设计师 — 6.信息安全

六. 信息安全 1. 加密技术与认证技术 &#xff08;1&#xff09;对称与非对称加密 关于对称与非对称加密算法的详细内容&#xff0c;可以参考文章&#xff1a;信息安全基础技术与原理 对称加密 对称加密也称为共享密钥加密。 对称加密中&#xff0c;加密和解密的密钥是同一…

【保姆级教程】跑通YOLOv8-multi-task多任务模型

一、YOLOV8多任务环境准备 1.1 下载安装最新的YOLOv8-multi-task代码 仓库地址: https://github.com/JiayuanWang-JW/YOLOv8-multi-task克隆指令:git clone https://githubfast.com/JiayuanWang-JW/YOLOv8-multi-task.git1.2 配置环境 pip install -r requirements.txt -i h…

IPython的捕获魔术:%%capture命令全攻略

IPython的捕获魔术&#xff1a;%%capture命令全攻略 在IPython和Jupyter Notebook中&#xff0c;%%capture是一个强大的魔术命令&#xff0c;它允许用户捕获并保存单元格的输出&#xff0c;包括stdout&#xff08;标准输出&#xff09;和stderr&#xff08;标准错误&#xff0…

laravel 8 、thinkphp数据库锁机制

lockForUpdate() 在使用时&#xff0c;如果只需要阻止另外程序对其进行修改&#xff0c;可以只使用 1 个lockForUpdate()&#xff1b; 当某个程序需要对其进行修改时&#xff0c;可以使用 lockForUpdate()&#xff0c;避免并发进行修改&#xff0c; 当其他程序也会需要对相同…

vivado IODELAY_GROUP

IODELAY_GROUP将IDELAYCTRL单元格及其关联的IDELAY和 ODELAY细胞允许正确放置和复制。 如果使用IODELAY_GROUP为IDELAYCTRL分配组名&#xff0c;还需要 使用相同的IODELAY_group属性将IDELAY或ODELAY单元格与组相关联。 重要提示&#xff1a;虽然IODELAY_GROUP可以包含多个单元…

【豆包Marscode体验官】揭秘MarsCode AI编辑助手:高效智能编辑新纪元之入门指导与最佳实践

文章目录 1. 概述2. 工具使用过程2.1 MarsCode插件简介2.2 安装和配置2.2.1 安装MarsCode插件2.2.2 配置MarsCode插件 2.3 各个功能的使用2.3.1 代码补全2.3.2 代码补全 Pro【操作提示&#xff0c;No suggestion from Model&#xff0c;不知道是不是版本的问题】2.3.3 代码生成…

sqlalchemy定期保持mysql连接活跃

sqlalchemy定期保持mysql连接活跃 在使用SQLAlchemy连接MySQL数据库时,确保保持活跃连接是很重要的,特别是在长时间不使用数据库连接时。以下是一些建议来定期保持活跃连接: 1、连接池设置: SQLAlchemy使用连接池管理数据库连接。通过配置合适的连接池参数可以有效地保持…

从零开始构建你的第一个Python Web应用

在本文中&#xff0c;我们将带领你从零开始构建一个简单的Python Web应用。不需要任何先验知识&#xff0c;我们会一步步地指导你完成设置、框架选择、代码编写到部署的整个过程。无论你是Web开发新手还是希望扩展技能的老手&#xff0c;这篇文章都将为你提供一个实践操作的起点…

C语言 | Leetcode C语言题解之第278题第一个错误的版本

题目&#xff1a; 题解&#xff1a; int firstBadVersion(int n) {int left 1, right n;while (left < right) { // 循环直至区间左右端点相同int mid left (right - left) / 2; // 防止计算时溢出if (isBadVersion(mid)) {right mid; // 答案在区间 [left, mid] 中…

abc363+cf960div.2+牛客周赛49轮

C - Avoid K Palindrome 2 (atcoder.jp) 思路&#xff1a; 罗列出排列的每一种情况&#xff0c;再根据题目要求进行判断 代码&#xff1a; void solve() {ll n, k;cin >> n >> k;string s;vector<char>a;cin >> s;for (int i 0; i < n; i)a.pus…

C++与lua联合编程

C与lua联合编程 一、环境配置二、lua基本语法1.第一个lua和C程序2.基本数据类型和变量2.1 Nil2.2 Booleans2.3 Numbers2.4 String(最常用) 3. 字符串处理3.1 错误处理3.2 字符串长度:string.len3.3 字符串子串 :string.sub3.4 字符串查找: string.find3.5字符串替换: string.gs…

sortablejs使用filter属性后,元素的默认事件失效了

在使用vue-draggable-plus或者sortablejs时。为了防止某个元素可以拖拽&#xff0c;一般会加上filter属性 但是加上后&#xff0c;会发现这个元素不能点击了&#xff0c;像我这里的滑块也不能滑动了。 查了很久才发现&#xff0c;还有一个属性是 preventOnFilter: true, // 在触…

安宝特方案|解放双手,解决死角,AR带来质量监督新体验

AR质量监督 解放双手&#xff0c;解决死角 在当今制造业快速发展的背景下&#xff0c;质量监督成为确保产品高质量和完善的管理制度的关键环节。然而&#xff0c;传统的质量监督方式存在诸多挑战&#xff0c;如人工操作带来的效率低下、查岗不及时、摄像头死角等问题。 为了解…

浅谈C语言整型类数据在内存中的存储

1、整型类数据 C语言中的整型类数据都归类在整型家族中&#xff0c;其中包括&#xff1a;char、short、int、long、long long这5个大类&#xff0c;而每个大类中又分为两类signed和unsigned,这些都是C语言中的内置类型。以下重点基于char和int这两种类型的数据进行阐述&#x…

C++学习笔记-C++11中的智能指针

1.智能指针介绍 智能指针是C的特性用法&#xff0c;是一个类似指针功能的类对象&#xff0c;其目的是为了更好的管理动态分配的内存&#xff0c;避免出现内存泄漏、悬空指针等问题。C11的标准库里提供了三种智能指针模板类&#xff0c;分别是std::unique_ptr、std::shared_ptr…

前端学习2——自学习梳理

1.HTML如何和CSS、JS关联呢 2.CSS语法(Css最重要的是&#xff1a;选择器和布局) 1. index2.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthd…

12 前端工程化

组件化 1. 组件化理解 就是将页面的某一部分独立出来&#xff0c;将这一部分的数据层&#xff08;M&#xff09;、视图层&#xff08;V&#xff09;和控制层&#xff08;C&#xff09;用黑盒的形式全部封装到一个组件内&#xff0c;暴露出一些开箱即用的函数和属性供外部调用。…

苹果笔记本电脑如何优化系统 苹果电脑系统优化软件哪个好 cleanmymac x怎么用

随着时间的推移&#xff0c;你可能会发现你的MacBook运行速度变慢&#xff0c;甚至在执行一些基本任务时也会感觉到卡顿。这不仅影响了工作效率&#xff0c;也大大降低了使用体验。但别担心&#xff0c;优化你的Mac系统比做早餐还简单。本文将用一种轻松的风格向你介绍7种简单易…

数据结构(1)(顺序表)

数据结构 数据结构 相互之间存在一种或多种特定关系的数据元素的集合。 逻辑结构 集合&#xff0c;所有数据在同一个集合中&#xff0c;关系平等。&#xff08;数组中的每一个int&#xff09; 线性&#xff0c;数据和数据之间是一对一的关系&#xff08;…