news 2026/8/27 15:11:32

华为OD机考双机位C卷 - 字符串计数匹配 (Java Python JS C/C++ GO )

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机考双机位C卷 - 字符串计数匹配 (Java Python JS C/C++ GO )

最新华为OD机试

真题目录:点击查看目录
华为OD面试真题精选:点击立即查看

华为OD机考双机位C卷

题目描述

给你一个字符串str和整数k,返回满足以下条件的所有子字符串个数:

  1. 恰好包含k个字母。
  2. 数字0-9各出现至少一次。

输入描述

  • 第一行字符串str(1≤ length ≤ 100000),仅包含数字和小写字母
  • 第二行为整数k(0 ≤ k ≤100000 )

输出描述

输出一个整数,表示满足所有条件的子字符串的个数。

子字符串是字符串中连续的非空字符序列

示例1

输入

a0123456789aa 1

输出

2

说明

解题思路

Java

importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);// 读取第一行输入,获取字符串strStringstr=scanner.nextLine();// 读取第二行输入,获取整数kintk=Integer.parseInt(scanner.nextLine());// 初始化计数器,用于统计满足条件的子字符串个数intcount=0;// 获取字符串的长度intn=str.length();// 特殊情况处理:当k=0时,即要求子字符串中不包含任何字母if(k==0){// 使用双指针方法,right指针逐步向右移动for(intleft=0,right=0;right<n;right++){// 创建数组用于记录每个数字(0-9)的出现次数int[]digits=newint[10];// 记录当前子字符串中字母的数量intletters=0;// 遍历从left到right的所有字符for(inti=left;i<=right;i++){charc=str.charAt(i);// 如果是字母,字母计数器加1if(c>='a'&&c<='z'){letters++;}// 如果是数字,对应数字的计数器加1elseif(c>='0'&&c<='9'){digits[c-'0']++;}}// 判断当前子字符串是否满足条件:不含字母且包含所有数字(0-9)if(letters==0&&allDigitsPresent(digits)){count++;}}}else{// 一般情况:当k>0时,需要恰好有k个字母的子字符串// 枚举所有可能的子字符串起始位置for(intleft=0;left<n;left++){// 创建数组用于记录每个数字(0-9)的出现次数int[]digits=newint[10];// 记录当前子字符串中字母的数量intletters=0;// 枚举所有可能的子字符串结束位置for(intright=left;right<n;right++){charc=str.charAt(right);// 如果是字母,字母计数器加1if(c>='a'&&c<='z'){letters++;// 优化:如果字母数量超过k,就不再继续扩展当前子字符串if(letters>k)break;}// 如果是数字,对应数字的计数器加1elseif(c>='0'&&c<='9'){digits[c-'0']++;}// 判断当前子字符串是否满足条件:恰好有k个字母且包含所有数字(0-9)if(letters==k&&allDigitsPresent(digits)){count++;}}}}// 输出结果System.out.println(count);}/** * 检查是否所有数字(0-9)都至少出现一次 * @param digits 记录数字出现次数的数组 * @return 如果所有数字都至少出现一次,返回true;否则返回false */privatestaticbooleanallDigitsPresent(int[]digits){// 检查每个数字是否都出现至少一次for(intdigit:digits){// 如果有任何一个数字的出现次数为0,返回falseif(digit==0)returnfalse;}// 所有数字都至少出现一次,返回truereturntrue;}}

Python

defall_digits_present(digits):""" 检查是否所有数字(0-9)都至少出现一次 Args: digits: 记录数字出现次数的列表 Returns: 如果所有数字都至少出现一次,返回True;否则返回False """fordigitindigits:ifdigit==0:returnFalsereturnTrue# 读取输入str_input=input()k=int(input())# 初始化计数器,用于统计满足条件的子字符串个数count=0n=len(str_input)# 特殊情况处理:当k=0时,即要求子字符串中不包含任何字母ifk==0:left=0# 使用双指针方法,right指针逐步向右移动forrightinrange(n):# 创建列表用于记录每个数字(0-9)的出现次数digits=[0]*10# 记录当前子字符串中字母的数量letters=0# 遍历从left到right的所有字符foriinrange(left,right+1):c=str_input[i]# 如果是字母,字母计数器加1if'a'<=c<='z':letters+=1# 如果是数字,对应数字的计数器加1elif'0'<=c<='9':digits[int(c)]+=1# 判断当前子字符串是否满足条件:不含字母且包含所有数字(0-9)ifletters==0andall_digits_present(digits):count+=1else:# 一般情况:当k>0时,需要恰好有k个字母的子字符串# 枚举所有可能的子字符串起始位置forleftinrange(n):# 创建列表用于记录每个数字(0-9)的出现次数digits=[0]*10# 记录当前子字符串中字母的数量letters=0# 枚举所有可能的子字符串结束位置forrightinrange(left,n):c=str_input[right]# 如果是字母,字母计数器加1if'a'<=c<='z':letters+=1# 优化:如果字母数量超过k,就不再继续扩展当前子字符串ifletters>k:break# 如果是数字,对应数字的计数器加1elif'0'<=c<='9':digits[int(c)]+=1# 判断当前子字符串是否满足条件:恰好有k个字母且包含所有数字(0-9)ifletters==kandall_digits_present(digits):count+=1# 输出结果print(count)

JavaScript

// 引入readline模块用于读取输入constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout});letinputLines=[];letlineCount=0;// 检查是否所有数字(0-9)都至少出现一次functionallDigitsPresent(digits){for(letdigitofdigits){if(digit===0)returnfalse;}returntrue;}// 读取输入rl.on('line',(line)=>{inputLines.push(line);lineCount++;if(lineCount===2){conststr=inputLines[0];constk=parseInt(inputLines[1]);letcount=0;constn=str.length;// 特殊情况处理:当k=0时,即要求子字符串中不包含任何字母if(k===0){// 使用双指针方法,right指针逐步向右移动for(letleft=0,right=0;right<n;right++){// 创建数组用于记录每个数字(0-9)的出现次数constdigits=newArray(10).fill(0);// 记录当前子字符串中字母的数量letletters=0;// 遍历从left到right的所有字符for(leti=left;i<=right;i++){constc=str.charAt(i);// 如果是字母,字母计数器加1if(c>='a'&&c<='z'){letters++;}// 如果是数字,对应数字的计数器加1elseif(c>='0'&&c<='9'){digits[parseInt(c)]++;}}// 判断当前子字符串是否满足条件:不含字母且包含所有数字(0-9)if(letters===0&&allDigitsPresent(digits)){count++;}}}else{// 一般情况:当k>0时,需要恰好有k个字母的子字符串// 枚举所有可能的子字符串起始位置for(letleft=0;left<n;left++){// 创建数组用于记录每个数字(0-9)的出现次数constdigits=newArray(10).fill(0);// 记录当前子字符串中字母的数量letletters=0;// 枚举所有可能的子字符串结束位置for(letright=left;right<n;right++){constc=str.charAt(right);// 如果是字母,字母计数器加1if(c>='a'&&c<='z'){letters++;// 优化:如果字母数量超过k,就不再继续扩展当前子字符串if(letters>k)break;}// 如果是数字,对应数字的计数器加1elseif(c>='0'&&c<='9'){digits[parseInt(c)]++;}// 判断当前子字符串是否满足条件:恰好有k个字母且包含所有数字(0-9)if(letters===k&&allDigitsPresent(digits)){count++;}}}}// 输出结果console.log(count);rl.close();}});

C++

#include<iostream>#include<string>#include<vector>using namespace std;// 检查是否所有数字(0-9)都至少出现一次boolallDigitsPresent(constvector<int>&digits){for(intdigit:digits){if(digit==0)returnfalse;}returntrue;}intmain(){// 读取输入string str;intk;getline(cin,str);cin>>k;// 初始化计数器,用于统计满足条件的子字符串个数intcount=0;intn=str.length();// 特殊情况处理:当k=0时,即要求子字符串中不包含任何字母if(k==0){// 使用双指针方法,right指针逐步向右移动for(intleft=0,right=0;right<n;right++){// 创建向量用于记录每个数字(0-9)的出现次数vector<int>digits(10,0);// 记录当前子字符串中字母的数量intletters=0;// 遍历从left到right的所有字符for(inti=left;i<=right;i++){charc=str[i];// 如果是字母,字母计数器加1if(c>='a'&&c<='z'){letters++;}// 如果是数字,对应数字的计数器加1elseif(c>='0'&&c<='9'){digits[c-'0']++;}}// 判断当前子字符串是否满足条件:不含字母且包含所有数字(0-9)if(letters==0&&allDigitsPresent(digits)){count++;}}}else{// 一般情况:当k>0时,需要恰好有k个字母的子字符串// 枚举所有可能的子字符串起始位置for(intleft=0;left<n;left++){// 创建向量用于记录每个数字(0-9)的出现次数vector<int>digits(10,0);// 记录当前子字符串中字母的数量intletters=0;// 枚举所有可能的子字符串结束位置for(intright=left;right<n;right++){charc=str[right];// 如果是字母,字母计数器加1if(c>='a'&&c<='z'){letters++;// 优化:如果字母数量超过k,就不再继续扩展当前子字符串if(letters>k)break;}// 如果是数字,对应数字的计数器加1elseif(c>='0'&&c<='9'){digits[c-'0']++;}// 判断当前子字符串是否满足条件:恰好有k个字母且包含所有数字(0-9)if(letters==k&&allDigitsPresent(digits)){count++;}}}}// 输出结果cout<<count<<endl;return0;}

C语言

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<stdbool.h>/** * 检查是否所有数字(0-9)都至少出现一次 * @param digits 记录数字出现次数的数组 * @return 如果所有数字都至少出现一次,返回true;否则返回false */boolallDigitsPresent(intdigits[10]){for(inti=0;i<10;i++){if(digits[i]==0)returnfalse;}returntrue;}intmain(){// 定义变量charstr[100001];// 字符串最大长度为100000intk;// 读取输入fgets(str,sizeof(str),stdin);// 移除换行符str[strcspn(str,"\n")]=0;scanf("%d",&k);// 初始化计数器,用于统计满足条件的子字符串个数intcount=0;intn=strlen(str);// 特殊情况处理:当k=0时,即要求子字符串中不包含任何字母if(k==0){// 使用双指针方法,right指针逐步向右移动for(intleft=0,right=0;right<n;right++){// 创建数组用于记录每个数字(0-9)的出现次数intdigits[10]={0};// 记录当前子字符串中字母的数量intletters=0;// 遍历从left到right的所有字符for(inti=left;i<=right;i++){charc=str[i];// 如果是字母,字母计数器加1if(c>='a'&&c<='z'){letters++;}// 如果是数字,对应数字的计数器加1elseif(c>='0'&&c<='9'){digits[c-'0']++;}}// 判断当前子字符串是否满足条件:不含字母且包含所有数字(0-9)if(letters==0&&allDigitsPresent(digits)){count++;}}}else{// 一般情况:当k>0时,需要恰好有k个字母的子字符串// 枚举所有可能的子字符串起始位置for(intleft=0;left<n;left++){// 创建数组用于记录每个数字(0-9)的出现次数intdigits[10]={0};// 记录当前子字符串中字母的数量intletters=0;// 枚举所有可能的子字符串结束位置for(intright=left;right<n;right++){charc=str[right];// 如果是字母,字母计数器加1if(c>='a'&&c<='z'){letters++;// 优化:如果字母数量超过k,就不再继续扩展当前子字符串if(letters>k)break;}// 如果是数字,对应数字的计数器加1elseif(c>='0'&&c<='9'){digits[c-'0']++;}// 判断当前子字符串是否满足条件:恰好有k个字母且包含所有数字(0-9)if(letters==k&&allDigitsPresent(digits)){count++;}}}}// 输出结果printf("%d\n",count);return0;}

文章目录

  • 最新华为OD机试
  • 题目描述
  • 输入描述
  • 输出描述
  • 示例1
  • 解题思路
  • Java
  • Python
  • JavaScript
  • C++
  • C语言

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 13:34:58

RocketMQ 架构与术语详解

目录标题RocketMQ 架构与术语详解一、部署架构总览1.1 集群拓扑图1.2 资源清单1.3 组件分布二、核心术语详解2.1 架构组件术语2.2 消息模型术语2.3 消费者模型术语2.4 性能指标术语三、服务端口说明3.1 NameServer 端口3.2 Broker 端口3.3 管理服务端口四、存储架构4.1 存储卷清…

作者头像 李华
网站建设 2026/8/24 15:07:03

靠谱的康有利到家理疗小程序样本

靠谱的康有利到家理疗小程序样本分析在互联网技术飞速发展的今天&#xff0c;到家服务类小程序成为众多行业拓展业务的新途径&#xff0c;理疗行业也不例外。康有利到家理疗小程序作为其中的典型代表&#xff0c;为我们提供了一个靠谱的样本。利民科技在这类小程序的开发与优化…

作者头像 李华
网站建设 2026/8/21 13:34:58

电脑配置流程(WebGL项目)

一、下载火狐浏览器&#xff1a;https://www.firefox.com/zh-CN/thanks/ 二、右键 右下角网络图标—打开网络和Internet设置—更改适配器选项—右键以太网—点击属性—双击Internet协议版本4&#xff08;TCP/IPv4&#xff09;&#xff0c;将自动获取IP改为手动获取&#xff0c…

作者头像 李华