字符的统计——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.rhkb.cn/news/382389.html

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

相关文章

.NET 情报 | 分析某云系统添加管理员漏洞

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

基于java web新生报到系统设计与实现

第1章 绪论 本章首先对建设新生报到系统的背景&#xff0c;传统新生报到管理所存在的问题进行分析&#xff0c;给出建立新生报到系统的意义&#xff0c;同时提出建设网站的设计思路&#xff0c;最后给出本论文的各章结构介绍。 1.1 引言 21世纪是富有挑战性的世纪。在世纪之…

C语言 | Leetcode C语言题解之第282题给表达式添加运算符

题目&#xff1a; 题解&#xff1a; #define MAX_COUNT 10000 // 解的个数足够大 #define NUM_COUNT 100 // 操作数的个数足够大 long long num[NUM_COUNT] {0};long long calc(char *a) { // 计算表达式a的值// 将数字和符号&#xff0c;入栈memset(num, 0, sizeof(num));in…

【每日刷题Day85】

【每日刷题Day85】 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 125. 验证回文串 - 力扣&#xff08;LeetCode&#xff09; 2. 43. 字符串相乘 - 力扣&#xff08;L…

【数据分享】2013-2022年我国省市县三级的逐月SO2数据(excel\shp格式\免费获取)

空气质量数据是在我们日常研究中经常使用的数据&#xff01;之前我们给大家分享了2000——2022年的省市县三级的逐月PM2.5数据和2013-2022年的省市县三级的逐月CO数据&#xff08;均可查看之前的文章获悉详情&#xff09;&#xff01; 本次我们分享的是我国2013——2022年的省…

大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; HadoopHDFSMapReduceHiveFlumeSqoopZookeeperHBaseRedis 章节内容 上一节我们完成了&#xff1a; HBase …

优选算法之二分查找(上)

目录 一、二分查找 1.题目链接&#xff1a;704. 二分查找 2.题目描述&#xff1a; 3.算法流程&#xff1a; 4.算法代码&#xff1a; 二、在排序数组中查找元素的第一个和最后一个位置 1.题目链接&#xff1a;34. 在排序数组中查找元素的第一个和最后一个位置 2.题目描述…

大语言模型-RetroMAE-检索预训练模型

一、背景信息&#xff1a; RetroMAE是2022年10月由北邮和华为提出的一种密集检索预训练策略。 RetroMAE主要应用于检索模型的预训练&#xff0c;模型架构为非对称的Encoder-Decode结构。 二、整体结构&#xff1a; RetroMAE的模型架构为非对称的Encoder-Decode结构。 Encod…

Linux嵌入式学习——数据结构——概念和Seqlist

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

k8s中部署Jenkins、SonarQube、StorageClass部署流程

部署Jenkins 系统环境&#xff1a; • kubernetes 版本&#xff1a;1.23.3 • jenkins 版本&#xff1a;2.172 • jenkins 部署示例文件 Github 地址&#xff1a;https://github.com/my-dlq/blog-example/tree/master/jenkins-deploy 一、设置存储目录 在 Kubenetes 环境下…

机器学习·概率论基础

概率论 概率基础 这部分太简单&#xff0c;直接略过 条件概率 独立性 独立事件A和B的交集如下 非独立事件 非独立事件A和B的交集如下 贝叶斯定理 先验 事件 后验 在概率论和统计学中&#xff0c;先验概率和后验概率是贝叶斯统计的核心概念 简单来说后验概率就是结合了先验概…

【SpingCloud】客户端与服务端负载均衡机制,微服务负载均衡NacosLoadBalancer, 拓展:OSI七层网络模型

客户端与服务端负载均衡机制 可能有第一次听说集群和负载均衡&#xff0c;所以呢&#xff0c;我们先来做一个介绍&#xff0c;然后再聊服务端与客户端的负载均衡区别。 集群与负载均衡 负载均衡是基于集群的&#xff0c;如果没有集群&#xff0c;则没有负载均衡这一个说法。 …

springcolud学习05Feign

Feign Feign是一个声明式的http客户端,我们知道,在不使用Feign之前,在微服务中,一个模块如果想要调用另一个模块中的某个功能,需要向其发起请求http请求,如果不使用Feign,我们就需要通过硬编码的形式去编写构建http请求 新建模型,建立一个和consumer一样的module,不…

Python 实现PDF和TIFF图像之间的相互转换

PDF是数据文档管理领域常用格式之一&#xff0c;主要用于存储和共享包含文本、图像、表格、链接等的复杂文档。而TIFF&#xff08;Tagged Image File Format&#xff09;常见于图像处理领域&#xff0c;主要用于高质量的图像文件存储。 在实际应用中&#xff0c;我们可能有时需…

leetcode算法题之接雨水

这是一道很经典的题目&#xff0c;问题如下&#xff1a; 题目地址 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 解法1&#xff1a;动态规划 动态规划的核心就是将问题拆分成若干个子问题求解&#…

TCP与UDP网络编程

网络通信协议 java.net 包中提供了两种常见的网络协议的支持: UDP&#xff1a;用户数据报协议(User Datagram Protocol)TCP&#xff1a;传输控制协议(Transmission Control Protocol) TCP协议与UDP协议 TCP协议 TCP协议进行通信的两个应用进程&#xff1a;客户端、服务端 …

GD32相较于STM32的优劣势

优势 1.更高的主频 GD32单片机的主频可以达到108MHz&#xff0c;‌而STM32的最大主频为72MHz&#xff0c;‌这意味着GD32在代码执行速度上具有优势&#xff0c;‌适合需要快速处理数据的场景 2.更低的内核电压 GD32的内核电压为1.2V&#xff0c;‌而STM32的内核电压为1.8V。…

【保姆级介绍服务器硬件的基础知识】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🦭服务器硬件基础知识 1. 🦭前言2. 🦭中央处理器(CPU)3. 🦭…

LeYOLO, New Scalable and Efficient CNN Architecture for Object Detection

LeYOLO, New Scalable and Efficient CNN Architecture for Object Detection 论文链接&#xff1a;http://arxiv.org/abs/2406.14239 代码链接&#xff1a;https://github.com/LilianHollard/LeYOLO 一、介绍 本文关注基于FLOP的高效目标检测计算的神经网络架构设计选择&am…

STM32CUBEIDE FreeRTOS操作教程(一):LED闪灯

STM32CUBEIDE FreeRTOS操作教程&#xff08;一&#xff09;&#xff1a;LED闪灯 STM32CUBEIDE(不是STM32CUBEMX)开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开…