2023-07-29:给你一个由数字组成的字符串 s,返回 s 中独特子字符串数量。 其中的每一个数字出现的频率都相同。

news2025/1/20 22:38:26

2023-07-29:给你一个由数字组成的字符串 s,返回 s 中独特子字符串数量。

其中的每一个数字出现的频率都相同。

答案2023-07-29:

大体步骤如下:

1.初始化变量base为固定值1000000007,用于计算哈希码。

2.创建一个空的哈希集合set,用于存储独特子字符串的哈希码。

3.创建一个长度为10的整数数组cnts,用于记录数字出现的频率。

4.循环遍历字符串s的每个字符,使用变量l来表示当前子字符串的起始位置。

5.在循环开始时,将数组cnts的所有元素初始化为0。

6.初始化哈希码hashCode为0。

7.初始化变量curVal、maxCnt、maxKinds和allKinds为0,分别表示当前数字值、最大频率、最大频率的数字种类数和所有数字种类数。

8.开始内层循环,依次遍历从l位置开始的子字符串的每个字符,使用变量r表示当前字符的索引。

9.将当前字符转换为整数curVal,同时计算哈希码hashCode,基于base的乘法运算,并加上curVal+1。

10.将cnts[curVal]加1表示当前数字curVal的频率增加了一次。

11.如果cnts[curVal]等于1,说明新出现了一种数字,将allKinds加1,表示所有数字的种类数增加了一种。

12.如果cnts[curVal]大于maxCnt,表示当前数字的频率超过了之前的最大频率,将maxCnt更新为cnts[curVal],并将maxKinds重置为1,表示找到一种新的最大频率数字。

13.如果cnts[curVal]等于maxCnt,表示当前数字的频率和最大频率相同,将maxKinds加1,表示累计的最大频率数字种类数增加了一种。

14.若maxKinds等于allKinds,表示当前子字符串中每种数字都出现了最大频率次数,将当前子字符串的哈希码hashCode添加到集合set中。

15.循环结束后,更新l的值,进入下一个子字符串的计算。

16.返回集合set的大小,即独特子字符串的数量。

17.在main函数中,定义字符串s为"11223",调用equalDigitFrequency函数计算结果,并打印输出。

时间复杂度:

该算法的时间复杂度为O(N2),其中N是字符串s的长度。外层循环遍历字符串s的每个字符,内层循环遍历以每个字符为起始位置的子字符串。因此,总的时间复杂度可以近似为N*(N+1)/2,即O(N2)。

空间复杂度:

该算法的空间复杂度为O(1),因为除了常数个变量之外,没有额外使用大量的空间。集合set的空间取决于独特子字符串的数量,但最坏情况下独特子字符串的数量是固定的,最多只有10个数字种类。因此,可以看作是常数级的空间复杂度,即O(1)。

go完整代码如下:

package main

import (
	"fmt"
	"strconv"
)

func equalDigitFrequency(s string) int {
	base := int64(1000000007)
	set := make(map[int64]bool)
	cnts := make([]int, 10)
	for l := 0; l < len(s); l++ {
		for i := 0; i < 10; i++ {
			cnts[i] = 0
		}
		hashCode := int64(0)
		curVal, maxCnt, maxKinds, allKinds := 0, 0, 0, 0
		for r := l; r < len(s); r++ {
			curVal, _ = strconv.Atoi(string(s[r]))
			hashCode = hashCode*base + int64(curVal+1)
			cnts[curVal]++
			if cnts[curVal] == 1 {
				allKinds++
			}
			if cnts[curVal] > maxCnt {
				maxCnt = cnts[curVal]
				maxKinds = 1
			} else if cnts[curVal] == maxCnt {
				maxKinds++
			}
			if maxKinds == allKinds {
				set[hashCode] = true
			}
		}
	}
	return len(set)
}

func main() {
	s := "11223"
	result := equalDigitFrequency(s)
	fmt.Println(result)
}

在这里插入图片描述

rust完整代码如下:

use std::collections::HashSet;

fn equal_digit_frequency(s: &str) -> usize {
    let base: i64 = 1_000_000_007;
    let mut set: HashSet<i64> = HashSet::new();
    let mut cnts: [i64; 10];
    let ss = s.as_bytes();

    for l in 0..ss.len() {
        cnts = [0; 10];
        let mut hash_code = 0;
        let mut cur_val;
        let (mut max_cnt, mut max_kinds, mut all_kinds) = (0, 0, 0);

        let mut r = l;

        while r < ss.len() {
            cur_val = ss[r] as i64 - '0' as i64;

            hash_code = (hash_code as i64).wrapping_mul(base as i64) + cur_val + 1;

            cnts[cur_val as usize] += 1;
            if cnts[cur_val as usize] == 1 {
                all_kinds += 1;
            }
            if cnts[cur_val as usize] > max_cnt {
                max_cnt = cnts[cur_val as usize];
                max_kinds = 1;
            } else if cnts[cur_val as usize] == max_cnt {
                max_kinds += 1;
            }

            if max_kinds == all_kinds {
                set.insert(hash_code);
            }
            r += 1;
        }
    }

    set.len()
}

fn main() {
    let s = "11223";
    let result = equal_digit_frequency(s);
    println!("{}", result);
}

在这里插入图片描述

c++完整代码如下:

#include <iostream>
#include <unordered_set>
#include <vector>

int equalDigitFrequency(std::string s) {
    const long long base = 1000000007;
    std::unordered_set<long long> set;
    std::vector<int> cnts(10, 0);

    for (int l = 0; l < s.length(); l++) {
        std::fill(cnts.begin(), cnts.end(), 0);
        long long hashCode = 0;
        int curVal, maxCnt = 0, maxKinds = 0, allKinds = 0;

        for (int r = l; r < s.length(); r++) {
            curVal = s[r] - '0';
            hashCode = hashCode * base + curVal + 1;

            cnts[curVal]++;
            if (cnts[curVal] == 1) {
                allKinds++;
            }
            if (cnts[curVal] > maxCnt) {
                maxCnt = cnts[curVal];
                maxKinds = 1;
            }
            else if (cnts[curVal] == maxCnt) {
                maxKinds++;
            }

            if (maxKinds == allKinds) {
                set.insert(hashCode);
            }
        }
    }

    return set.size();
}

int main() {
    std::string s = "11223";
    int result = equalDigitFrequency(s);
    std::cout << result << std::endl;

    return 0;
}

在这里插入图片描述

c完整代码如下:

#include <stdio.h>
#include <stdbool.h>

#define BASE 1000000007
#define MAX_DIGITS 10

int equalDigitFrequency(char* s) {
    unsigned long long set[MAX_DIGITS] = { 0 };
    int cnts[MAX_DIGITS] = { 0 };
    int setSize = 0;

    for (int l = 0; s[l] != '\0'; l++) {
        for (int i = 0; i < MAX_DIGITS; i++) {
            cnts[i] = 0;
        }

        unsigned long long hashCode = 0;
        int curVal, maxCnt = 0, maxKinds = 0, allKinds = 0;

        for (int r = l; s[r] != '\0'; r++) {
            curVal = s[r] - '0';

            hashCode = hashCode * BASE + curVal + 1;
            cnts[curVal]++;

            if (cnts[curVal] == 1) {
                allKinds++;
            }

            if (cnts[curVal] > maxCnt) {
                maxCnt = cnts[curVal];
                maxKinds = 1;
            }
            else if (cnts[curVal] == maxCnt) {
                maxKinds++;
            }

            if (maxKinds == allKinds) {
                bool exists = false;
                for (int i = 0; i < setSize; i++) {
                    if (set[i] == hashCode) {
                        exists = true;
                        break;
                    }
                }
                if (!exists) {
                    set[setSize++] = hashCode;
                }
            }
        }
    }

    return setSize;
}

int main() {
    char s[] = "11223";
    int result = equalDigitFrequency(s);
    printf("%d\n", result);
    return 0;
}

在这里插入图片描述

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

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

相关文章

InnoDB引擎底层逻辑讲解——架构之内存架构

1.InnoDB引擎架构 下图为InnoDB架构图&#xff0c;左侧为内存结构&#xff0c;右侧为磁盘结构。 2.InnoDB内存架构讲解 2.1 Buffer Pool缓冲池 2.2 Change Buffer更改缓冲区 2.3 Adaptive Hash Index自适应hash索引 查看自适应hash索引是否开启&#xff1a; show variable…

qt截图软件中画箭头代码原理

截图工具中&#xff0c;需要画一个指向箭头&#xff0c; 该箭头的形状解析示意图如下所示&#xff0c; 对应的qt代码如下&#xff1a; // 画出一个箭头线&#xff0c;主要是算出这几个点。 // 这个箭头形状是这样的&#xff0c;胖嘟嘟的那种&#xff0c;但是出发点是一个细的 Q…

机器学习深度学习——权重衰减

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——模型选择、欠拟合和过拟合 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你…

教雅川学缠论04-笔

笔由3部分组成&#xff1a; 顶分型K线底分型&#xff0c;或者 底分型K线顶分型 注意&#xff1a;笔加一起至少7根K线&#xff0c;因为一个底分型至少3根&#xff0c;K先至少1个&#xff0c;顶分型至少3根 下图中红色线段就是一个标准的笔&#xff0c;它始于一个底分型&#xff…

❤️创意网页:创建更炫酷的动态网页——彩色数字(1到9)粒子动画

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

基于WSL2、Ubuntu和VS Code的CUDA平台运行C语言程序

一、CUDA程序执行方法 执行步骤为&#xff1a; 安装Visual Studio Code。在Visual Studio Code中安装插件WSL与电脑的WSL2进行连接。点击左下角&#xff0c;然后再选择连接到WSL。 在WSL中创建以 .cu 为后缀的文件。 rootDESKTOP-HR6VO5J:~# mkdir CUDA /…

VMware Linux 可视化增加磁盘

1、VMware 增加磁盘 2、disks挂载磁盘 此处我挂载的是20G磁盘&#xff0c;截图只是用5G的做过程演示例子。 3、验证挂载磁盘

Chrome 浏览器+Postman还能这样做接口测试 ?

如果把测试简单分为两类&#xff0c;那么就是客户端测试和服务端测试。客户端的测试包括UI测试&#xff0c;兼容性测试等&#xff0c;服务端测试包括接口测试。接口测试检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;它绕过了客户端&#xff0c;直接对服务端进行测…

UE5 C++ SplineMesh蓝图函数库实现(小白笔记)

UE5 C++ SplineMesh的蓝图函数库实现方法 UAAABlueprintFunctionLibrary UAAABlueprintFunctionLibrary.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "Components/Spl…

【Java开发】 Mybatis-Flex 01:快速入门

Mybatis 作为头部的 ORM 框架&#xff0c;他的增强工具可谓层出不穷&#xff0c;比如出名的 Mybatis-Plus 和 阿里云开源的 Fluent-MyBatis&#xff0c;如今出了一款 Mybatis-Flex &#xff0c;相比前两款功能更为强大、性能更为强悍&#xff0c;不妨来了解一下。 目录 1 Myba…

CAD Voronoi3D V1.0.1 版本更新说明

更新说明 CAD Voronoi3D V1.0.1版本对泰森多边形晶格进行进一步的优化。 采用新算法大幅度减少形体边界出现小晶格的可能性&#xff0c;使区块更均匀&#xff1a; 优化曲边边界晶格曲率问题&#xff0c;消除曲边形体晶格边界曲率过大现象&#xff1a; 优化生成算法&#xff…

Ubuntu—vi编辑器的使用一

vi编辑器 vi是Linux中最基本的编辑器。但vi编辑器在系统管理、服务器配置工作中永远都是无可替代的。 vi编辑器的使用 vi有以下三种模式 命令行模式 用户在用vi编辑文件时&#xff0c; 最初进入的是该模式。可以进行复制、粘贴等操作 插入模式 进行文件编辑&#xff0c; 按…

35.图片幻灯片

图片幻灯片 html部分 <div class"carousel"><div class"image-container"><img src"./static/20180529205331_yhGyf.jpeg" alt"" srcset""><img src"./static/20190214214253_hsjqw.webp"…

PP-Matting: AI高精度图像前景Matting,让抠图轻而易举

分割和Matting的一个重要区别是:分割返回的是像素分类标签,其结果是整型数据;而Matting返回的是属于前景或背景的概率P,从而在前景与背景交互区域产生渐变的效果,使得抠图更加自然。Matting分割模型训练完成后,对于原始图像每个位置上的像素,都将生成一个表示其前景透明…

AB 压力测试

服务器配置 阿里云Ubuntu 64位 CPU1 核 内存2 GB 公网带宽1 Mbps ab -c100 -n1000 http://127.0.0.1:9501/ -n&#xff1a;在测试会话中所执行的请求个数。默认时&#xff0c;仅执行一个请求。 -c&#xff1a;一次产生的请求个数。默认是一次一个。 ab -c 100 -n 200 ht…

阿里云SMS测试三步曲

文章目录 阿里云SMS测试三步曲申请签名与模板申请签名申请模板 AcesssKey测试用例Apache Maven测试代码 阿里云SMS测试三步曲 申请签名与模板 签名与模板的申请的审核时间有1个多小时&#xff0c;且是9~21点时间段内 申请签名和模板时如果是为了做测试&#xff0c;要特别说明…

玩转Tomcat:从安装到部署

文章目录 一、什么是 Tomcat二、Tomcat 的安装与使用2.1 下载安装2.2 目录结构2.3 启动 Tomcat 三、部署程序到 Tomcat3.1 Windows环境3.2 Linux环境 一、什么是 Tomcat 一看到 Tomcat&#xff0c;我们一般会想到什么&#xff1f;没错&#xff0c;就是他&#xff0c;童年的回忆…

山水TW91耳机恢复出厂设置

当出现左右耳不互联或者设备无法配对时&#xff0c;可按照以下操作进行重置&#xff1a; ①先在手机端删除“SANSUI”耳机的配对信息。 ②耳机开机未连接状态下&#xff0c;连击4次左/右耳功能键后复位&#xff0c;耳机自动关机清除配对。&#xff08;提示已关机表示操作正确&a…

JavaSE - Sting类

目录 一. 字符串的定义 二. String类中的常用方法 1. 比较两个字符串是否相等&#xff08;返回值是boolean类型&#xff09; 2. 比较两个字符串的大小&#xff08;返回值是int类型&#xff09; 3. 字符串查找 &#xff08;1&#xff09;s1.charAt(index) index:下标&…

【React Native】学习记录(二)——路由搭建和常见的开发技巧

模拟器设置成中文 在开发过程中发现&#xff0c;两个模拟器都不能输入中文&#xff0c;所以需要配置一下。 先说一下安卓&#xff0c;在弹出的输入框中查看设置&#xff0c;设置一下对应的languages即可&#xff1a; 在苹果模拟器中&#xff0c;跟苹果手机一样&#xff0c;打…