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

news2024/11/15 19:53:02

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++;
                else
                    break;
                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.coloradmin.cn/o/1944917.html

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

相关文章

C++ - 基于多设计模式下的同步异步⽇志系统

1.项目介绍 项⽬介绍 本项⽬主要实现⼀个⽇志系统&#xff0c; 其主要⽀持以下功能: • ⽀持多级别⽇志消息 • ⽀持同步⽇志和异步⽇志 • ⽀持可靠写⼊⽇志到控制台、⽂件以及滚动⽂件中 • ⽀持多线程程序并发写⽇志 • ⽀持扩展不同的⽇志落地⽬标地 2.开发环境 • Cent…

第二证券:净现比是什么?怎么计算?

1、净现比的含义 净现比是指运营活动产生的现金净流量与净获利的百分比&#xff0c;是用来衡量企业实在盈利才干的目标。净现比也叫做净获利现金含量&#xff0c;即企业的净获利中&#xff0c;有多少转化成现金进入我们的钱包。 2、净现比的核算 净现比的核算公式为&#xf…

聊聊预训练模型的微调

前言 Transformers 提供了一个 Trainer 类&#xff0c;处理微调在数据集上提供的任何预训练模型。 完成所有数据预处理工作后&#xff0c;只需执行几个步骤即可定义 Trainer。 最困难的部分可能是准备运行 Trainer.train() 的环境&#xff0c;因为它在 CPU 上运行速度非常慢。…

全面解析:如何开发智能的食堂采购管理系统

今天&#xff0c;小编将全面解析如何开发一个智能的食堂采购系统&#xff0c;包括需求分析、系统设计、技术选择、开发过程以及测试和部署等方面。 一、需求分析 在开发智能食堂采购系统之前&#xff0c;首先需要进行详细的需求分析。这一步至关重要&#xff0c;因为它直接决定…

【Java 数据结构】ArrayList类介绍

ArrayList类介绍 初识List接口ArrayList类ArrayList类是什么顺序表的模拟实现初始化增加元素删除元素查找元素修改元素 ArrayList类使用构造方法ArrayList源码阅读常用方法及其注意事项 初识List接口 List 是集合框架中的一个接口, 它的里面包含了一些方法, 例如add(), remove…

【Python系列】详解 open 函数:文件操作的基石

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

OpenAI 发完 GPT-4o,国内大模型行业还有哪些机会?

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量 全世界范围内的很多人&#xff0c;我也不例外&#xff0c;想象中的GPT5发布时间应该是24年中&#xff0c;但实际上OpenAI在这个时间点最强的模型是GPT4o&#xff0…

利用一维数组计算今天是今年的第几天

分析&#xff1a; 在一维数组里初始化12个月份&#xff0c;在进行判断是不是闰年&#xff0c;是闰年就把数组的二月的下标改为29&#xff0c;否则不变就按照平年计算&#xff0c;最后把想要计算的月份减1累加到sum里&#xff0c;在进行计算该月份的天也要累加。例如&#xff1a…

Python:对常见报错导致的崩溃的处理

Python的注释&#xff1a; mac用cmd/即可 # 注释内容 代码正常运行会报以0退出&#xff0c;如果是1&#xff0c;则表示代码崩溃 age int(input(Age: )) print(age) 如果输入非数字&#xff0c;程序会崩溃&#xff0c;也就是破坏了程序&#xff0c;终止运行 解决方案&#xf…

FPGA-ROM IP核的使用(2)

前言 接着昨天的进行一个小的实验验证ROM IP核。 实验效果 读取上一期生成的IP核中的数据&#xff0c;并将其显示在数码管上。 具体流程 ROM IP核存放数据0~255&#xff0c;之后每隔0.2s&#xff0c;从0的地址开始读数据&#xff0c;并显示在数码管上&#xff1b;接着先后…

力扣 快慢指针

1 环形链表 141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 定义两个指针&#xff0c;一快一慢。慢指针每次只移动一步&#xff0c;而快指针每次移动两步。初始时&#xff0c;慢指针和快指针都在位置 head&#xff0c;这样一来&#xff0c;如果在移动的过程中&#x…

Flink入门(更新中)

目录 一、Flink 1.1 基本概念 1.1.1 flink简介 1.2 flink编程模版 1.3 常用概念 1.2.1 datastream 1.2.2 算子、Task 1.2.3 多流操作 1.2.6 时间语义 二、Flink编程实战(Java) 2.1 wordcount 一、Flink 1.1 基本概念 1.1.1 flink简介 1.图片介绍 性能&#xff1a…

Python 爬虫(爬取百度翻译的数据)

前言 要保证爬虫的合法性&#xff0c;可以从以下几个方面着手&#xff1a; 遵守网站的使用条款和服务协议&#xff1a;在爬取数据之前&#xff0c;仔细阅读目标网站的相关规定。许多网站会在其 robots.txt 文件中明确说明哪些部分可以爬取&#xff0c;哪些不可以。 例如&…

Java语言程序设计基础篇_编程练习题**15.19 (游戏:手眼协调)

**15.19 (游戏:手眼协调) 请编写一个程序&#xff0c;显示一个半径为10像素的实心圆&#xff0c;该圆放置在面板上的随机位置&#xff0c;并填充随机的顔色&#xff0c;如图15-29b所示。单击这个圆时&#xff0c;它会消失&#xff0c;然后在另一个随机的位置显示新的随机颜色的…

PySimpleGUI的安装、使用介绍

PySimpleGUI的安装等介绍 如果直接使用pip命令是无法下载免费版的&#xff0c;通过设置的python Interpreter也不可以下载到5.0.0之前的版本了。 现在已经无法通过pycharm直接获取到PySimpleGUI的免费&#xff08;无需登录&#xff09;版&#xff0c;不过听说可以登入官网然后进…

OpenTeleVision复现及机器人迁移

相关信息 标题 Open-TeleVision: Teleoperation with Immersive Active Visual Feedback作者 Xuxin Cheng1 Jialong Li1 Shiqi Yang1 Ge Yang2 Xiaolong Wang1 UC San Diego1 MIT2主页 https://robot-tv.github.io/链接 https://robot-tv.github.io/resources/television.pdf代…

JavaWeb连接(JDBC)数据库实现增删改查

JavaWeb连接(JDBC)数据库实现增删改查 1、数据库结构 (1)、创建数据库&#xff08;source_db&#xff09; (2)、创建数据表&#xff08;tb_source&#xff09;&#xff0c;结构如下 字段名说明字段类型长度备注id编号int主键&#xff0c;自增&#xff0c;增量为 1name名称v…

通过Docker安装KingbaseES V8并激活开发License

人大金仓最大连接数的修改跟pgsql差不多&#xff0c;就是修改kingbase.conf文件&#xff0c;修改里面的max_connections 10 &#xff0c;有时候会发现修改后不成功的问题&#xff0c;最直接的表现就是在修改后重启服务&#xff0c;控制台还是提示重置为10&#xff0c;最大的原…

区块链浏览器开发指南分享

01 概括 区块链浏览器是联盟链上的一种数据可视化工具&#xff0c;用户可以通过web页面&#xff0c;直接在浏览器上查看联盟链的节点、区块、交易信息和子链信息、标识使用信息等&#xff0c;用以验证交易等区块链常用操作。 02功能模块 区块链网络概览 区块链网络概览显示…

leetcode日记(47)螺旋矩阵Ⅱ

这题思路不难&#xff0c;就是找规律太难了。 我首先的思路是一行一行来&#xff0c;根据规律填入下一行的数组&#xff0c;第i行是由前i个数字&#xff08;n-2*i&#xff09;个增序数列后i个数字组成&#xff0c;后来觉得太难找规律了就换了一种思路。 思路大致是先计算出需…