百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

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

bigegpt 2024-10-31 12:18 4 浏览

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(N^2),其中N是字符串s的长度。外层循环遍历字符串s的每个字符,内层循环遍历以每个字符为起始位置的子字符串。因此,总的时间复杂度可以近似为N*(N+1)/2,即O(N^2)。

空间复杂度:

该算法的空间复杂度为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;
}

在这里插入图片描述

福大大架构师每日一题java当死,golang当立。最新面试题,涉及golang,rust,mysql,redis,云原生,算法,分布式,网络,操作系统。

公众号

福大大架构师每日一题



相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...