数组中字符出现的次数问题

【26美赛D题】2026美赛数学建模(MCM/ICM)思路解析及代码分享 2026美赛D题数学建模竞赛思路解析摘要:本文针对美赛D题提供系统性解决方案,提出四层建模框架(数据层、机理层、模型层、决策层),强调逻辑闭环比模型复杂度更重要。包含通用建模步骤:指标体系构建、状态评估、动态预测和策略优化,并给出Python基础代码框架。论文建议采用七段式结构,突出从现实问题到决策方案的完整闭环。核心在于通过数据驱动方法揭示问题规律,结合多源数据整合、系统行为建模和风险评估,最终形成可落地的决策建议,体现数学建模解决实际问题的能力。 阅读详情

在编程题中经常会遇到数字在数组中出现的次数这种问题,常见的问题有:第一次出现的数字,只出现一次的数字,一个数字出现几次,要注意数组的形式,是排序数组还是没有规律数组,考虑这几个方面,解题思路是不同的。

下面就剑指offer中遇到的问题,列举如下:

1、第一个只出现一次的字符

题目描述:在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符,并返回它的位置

解题思路:如果能够按字符出现的顺序统计数字出现的次数,那么第一个次数等于1的字符位置就是要求结果,可以新开辟一个大小为256的数组当做hashmap(为什么是256,因为char是8bit 能有256种可能),来统计字符出现的次数。

函数方程如下 :输入一个字符串

int FirstNotRepeatingChar(string str) {
     if(str.length() <= 0) return -1;
         
        int hash[256] = {0};
        int i = 0;
        for(i; i < str.length(); i++)//统计每个字符出现的次数
        {
            hash[str[i]]++;          
        }
        i = 0;
        while(str[i] != '\0')
        {
            if(hash[str[i]] == 1){break;}//找出第一个出现一次的字母,并返回它的位置
            i++;
        }       
        return i;
    }


2、数组中只出现一次的数字

题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

解题思路:这个题也可以题一的方法解决,但是如果要求不能开辟新的空间,那应该怎么计算呢。数字出现2次的,如果给第一次出现的数字赋值true,那么第二次出现赋值false,那最后只有出现一次的数字还是true,其他都是false。但是用什么方法实现这个呢。

相同的数字进行二进制异或 结果为0,所以如果数组中只存在一个出现一次的数字,那么把数组中所有的数字异或结果之和就是出现一次的数字。但是数组中有2个不同的数字时,如果把数组分成两组,每一组只存在一个出现一次的数字,就可以直接求出这个数组是什么了;

函数方程如下:

 void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {       
        int len = data.size();
        if(len <= 1) return;
        int resultXOR = 0;//采用异或位运算,二进制时,相同为0,不同为1
        for(int i = 0; i < len; i++)
        {
            resultXOR ^= data[i];//最终resultXOR的结果为那两个不同的数异或结果           
        }
        //找出resultXOR的二进制中从右开始计算,第一个出现1的位置,位置记为n,判断数组中数字位置n是否为1,把数组分成两部分,这样就把两个不同的数字分到了两组
        //然后每一组分别进行异或运算,异或结果就是出现一次的数字;
        int flag = 1; //判断第一次出现1的位置
       while(resultXOR)
       {
          if((resultXOR & flag) != 0){break;} 
           flag = flag << 1;//error:容易错误的地方,我之前左移一直写的是 flag << 1;这样你一直没有把移后的值赋值给flag,所以一直循环 正确写法:flag = flag << 1;
       }      
        *num1 = *num2 = 0; //存储2个不同的数字的变量赋初值为0        
        for(int i = 0; i < len; i++)
        {
           if((data[i] & flag) != 0)
           {
               *num1 ^= data[i];
           }
           else{
               *num2 ^= data[i];
           }           
        }              
    }
找出只出现一次的值,把结果赋值给num1和num2;


3、数字在排序数组中的次数

题目描述:统计一个数字在排序数组中出现的次数。

题目解析:如果直接遍历数组,直接统计所求数字的字数这个方法也是可以的,但是这个方法对于数组是否为排序数组所用的时间复杂度都是一样的,但是竟然都是排序数组了,这种方法不是最好的,排序数组查找一个数,首先就会想到二分查找。

二分查找先找到这个需要统计的数。然后以这个数为界限分为左右两边,继续用二分查找左边求出数字的第一次出现的位置,右边找出数字最后一次出现的位置。(因为排序数组相同的数字总是连在一起的),用最后一次出现的位置减去第一次出现的位置+ 1 就是数字出现的次数

函数代码如下:

  int GetNumberOfK(vector<int> data ,int k) {
        if(data.size() <= 0) return 0;//数组为空返回0
        int length = data.size();
        int left = 0, right = length-1;
        int num = 0;//统计数字重复的个数
        //利用二分查找进行计算
        while(left <= right)
        {
           int mid = (left + right)/2;
            if(data[mid] > k)
            {
                right = mid - 1;                
            }
            if(data[mid] < k)
            {
                left = mid + 1;               
            }
            //当中间数字为要查找的数时,分为左右两组进行二分查找,找出要查找数字的最左边界和最右边界
            if(data[mid] == k)
            {          
               int ll = left, lr = mid;//定义中间以左的左边界和右边界
               int rl = mid, rr = right;//定义中间以右的左边界和右边界
               while(data[ll] != k && lr >= 0 && ll <= lr)//找出左边第一个值为k的结点
               {   int lmid = (ll + lr)/2;
                   if(data[lmid] < k )
                   {
                       ll = lmid + 1;
                   }
                   if(data[lmid] == k )
                   {
                       lr = lmid - 1;
                   }                   
               }
               while(data[rr] != k && rl <= length && rl <= rr)//找出右边第一个值为k的结点
               {
                   int  rmid = (rl + rr)/2; 
                   if(data[rmid] > k)
                   {
                       rr = rmid - 1;
                   }
                   if(data[rmid] == k)
                   {
                       rl = rmid + 1;                     
                   }
               }
               num = rr - ll + 1; 
               break;
            }
        }
        return num;
    }



MIKE水动力笔记5_建立水动力模型 前文已经讲了如何制作网格文件(.mdf文件),这一博文就讲如何建立水动力模型。 阅读详情

相关推荐

简单说说Python中的pip如何换源

【安装包】:pip install 【升级包】:pip install --upgrade 【卸载包】:pip uninstall 【查看已安装的包】:pip list【搜索包】:pip search (注意:pip search功能在pip 10.0.0之后被弃用,建议使用其他方式搜索包,如访问PyPI官网或使用其他搜索引擎)

一捌柒的博客 2667

找出字符串中第一个只出现一次的字符

数据范围:输入的字符串长度满足 1≤n≤1000。输出第一个只出现一次的字符,如果不存在输出-1。找出字符串中第一个只出现一次的字符。

weixin_56316833的博客 2170

STDP实战:用PyTorch从零搭建脉冲神经网络(附完整代码)

本文提供了基于PyTorch从零搭建脉冲神经网络的实战教程,重点讲解了STDP学习规则的原理与工程实现。通过构建LIF神经元模型和向量化STDP层,并结合泊松编码,详细演示了如何构建一个能够进行无监督特征学习的混合网络架构,为探索神经形态计算和低功耗实时学习方案提供了完整代码与实践指南。

weixin_29056145的博客 263

java统计字符数组中每个字符出现的个数

//统计字符数组中每个字符出现的个数 public class Demo01 { public static void main(String[] args) { char [] arrs = {'a','b','b','b','a','c','a'}; //初始化需要统计字符的数组 char [] arrs1 = new char[arrs.length]; int [] num = new int [arrs.length]; .

m0_62642719的博客 5013

5分钟搞定!用Cursor和.NET 9.0快速搭建串口通讯上位机(附VS Code插件配置)

本文分享了如何利用Cursor AI编程助手与.NET 9.0,在5分钟内快速构建一个功能完整的串口通讯上位机程序。通过自然语言描述需求,AI自动生成WinForms界面和核心代码,极大提升了硬件调试工具的定制开发效率。文章详细介绍了环境配置、AI协作编码、功能实现与调试的全过程。

weixin_28366353的博客 274

海思Hi3061M MCU:为高速吹风筒市场注入智能动力

此外,海思还提供了丰富的软件开发工具和生态环境组件,帮助开发者快速实现复杂功能。高速吹风筒因其高效的风力和快速的干燥效果,近年来在市场上越来越受欢迎。然而,传统的高速吹风筒在性能、噪音和使用寿命等方面仍有改进的空间。凭借其高性能、低功耗、低噪声和易用的开发工具,为高速吹风筒市场带来了全新的解决方案。这不仅提高了用户的使用体验,还延长了电机的使用寿命。这不仅减少了电机的电磁噪声,还提高了电机的运行效率。还支持风机顺逆风启动适配多种电阻范围的电机,进一步提高了吹风筒的适用性和灵活性。

2401_83448585的博客 2016

Java 编程练习:统计数组中字符出现的次数

Java编程练习分享

qq_36377139的博客 2108

华为OD机考双机位C卷 - 斗地主之顺子 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 斗地主之顺子(OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 9692

数组统计字符串的出现次数

然后,在遍历字符串 str 的每个字符时,首先通过 str.charAt(j) 获取当前字符所对应的 ASCII 码值,将此值用作 s[] 数组的索引,将该索引位置处的元素值加 1,即实现了对当前字符出现次数的统计。上述输出示例中,第一个字符串总共出现了 5 次不同的字符,它们的出现次数分别为 2、1、1、1、0,由大到小排序得到 2、1、1、1、0,对应的数值就是 2x26+1x25+1x24+1x23 = 532。以此类推,我们可以计算出每个字符串的输出值。

weixin_40540942的博客 826

SKUA-GOCAD入门教程-第七节 点的创建与编辑3

本文介绍了四种从井数据创建点集的方法

江洋大葱的博客 963

IGBT基础知识及应用电路仿真(Multisim)

本文系统介绍了IGBT(绝缘栅双极晶体管)及其应用电路。首先详细解析了IGBT的基本结构、工作原理和特性参数,重点阐述了其五层半导体结构、电导调制效应和电压驱动特性。随后通过Multisim仿真展示了IGBT在四种典型功率变换电路中的应用:半桥驱动电路实现隔离式互补驱动;全桥逆变电路完成DC-AC转换;三相桥式逆变电路生成三相交流电;直流斩波电路(BUCK/BOOST/BUCK-BOOST)实现电压升降变换。文章通过理论分析与仿真波形相结合,全面呈现了IGBT在中高压大功率场景下的优异性能和灵活应用。

XU157303764的博客 1217

字符串数组判断每个字符串出现的次数解决方案

要求: 例如我们有一个字符串数组如下: { "111","222","111","111" ,"222","333","6"}; 我们需要判断每个字符串出现的次数 输出样式为 111 出现的次数 3 222 出现的次数 2 333 出现的次数 1 6 出现的次数 1 思想: 1、定义一个结构体存放第一次出现的字符,如有重复的字符记录其出现的次数 如下 typedef struct SaveMessage { char fo[512]; //存放第一次出现的字符 int count; //

老舍 1853

petalinux2022.2启动文件编译配置

petalinux2021之前的版本里,导入目录components/yocto/下的“environment-setup-aarch64-xilinx-linux” 和 “layers/core/oe-init-build-env”的环境,能使用Yocto的devtool工具。(加入下面内容,先petalinux-build下载完成后才能有源码)制作 BOOT.BIN 启动文件:petalinux-package --boot --fsbl --fpga --u-boot --force。

wangjie36的博客 1388

OJ题目--1,创建数组储存字符串中出现的字符次数问题(5)

1,求字符串中第一个只出现一次的字符:第一个只出现一次的字符_牛客题霸_牛客网 (nowcoder.com) 由于字符在计算机中归根结底是由阿斯克码所代表的,因此可以创建一个数组,每一个字符出现的次数就放在数组中其阿斯克码所对应的下标位置,到时候,从第一个字符对应的阿斯克码的下标开始寻找,找到的第一个元素为1的字符即为想要找的字符。 注:这里第二个for循环中,在创建的table数组中,是按照字符出现的顺序在数组中寻找字符出现的顺序的。获得数组中存储的每一个字符出现次数,还可以从1到128依次遍历,但是

m0_62908071的博客 624

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

关于JAVA字符串对象数组的循环次数问题

代码如下,为什么 static class Bomblet extends Telephone{  //小灵通类      String[] record;  //通讯录记录     double receivedTime; //被叫时间      Bomblet(String b, String n){    super(b, n);   }      double getRe

Zpseudocode的专栏 567

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

作业--1统计字符串中每一个字符出现的次数 2.字符串的方法 3.数组的迭代方法有哪些,什么作用 4.对于this的理解,及this指向问题

作业随笔 1统计字符串中每一个字符出现的次数 2.字符串的方法 3.数组的迭代方法有哪些,什么作用 4.对于this的理解,及this指向问题

lmd_hdx的博客 163

每日一练3——C++字符串中找出连续最长的数字串问题&&数组中出现次数超过一半的数字问题

遍历字符串,使用cur去记录连续的数字串,如果遇到不是数字字符,则表示一个连续的数字串结束了,则将数字串跟之前的数字串比较,如果更长,则更新更长的数字串更新到res。众数:就是出现次数超过数组长度一半的那个数字如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数。数组排序后,如果符合条件的数存在,则一定是数组中间那个数。这种方法虽然容易理解,但由于涉及到快排sort,其时间复杂度为O(NlogN)并非最优。

博主qq1077644249 498

求字符串中某字符重复出现次数

Description给定一个只有小写英文字母组成的字符串,串长为n。请你编写程序求出这个字符串中出现次数最多的字母。Input输入的第一行为t(0 对于每组测试用例,输入有两行。第一行是一个正整数n( 1 后面一行是一个长度为n的字符串(只由小写字母组成)。Output对于每组测试用例,输出一行,仅输出出现次数最多的字母。测试用例保证出现次数最多的字母只有一个。Sample Inpu

心静、思远、志行千里 3012

【算法基础】真题实战-数组中前k个重复最多的字符串

HaspMap使用键值对存储 ,Key存储字符串,Value存储出现的次数。

大猩猩不见了 214

求一个字符串中连续出现次数最多的子串

程序员宝典上的原题,求一个字符串中连续出线次数最多的子串,知道string 中substr的功能做题会方便很多。大案中使用了后缀数组。substr[0] = abcbcbcabc substr[1] = bcbcbcabc substr[2] = cbcbcabc substr[3] = bcbcabc substr[4] = cbcabc substr[5] = bcabc subs

YSL93的博客 463

0_1数组与字符串

数组与字符串是编程基础中的核心内容,涉及哈希表、动态规划等高级应用。本文从基本解题策略出发,重点介绍了哈希表在元素统计、冲突处理中的应用,以及各类典型题目(如次数统计、回文串识别、矩阵操作)的解题思路。文章强调合理利用数据结构(如哈希表O(1)查询特性)和边界条件处理的重要性,并分类整理了包括唯一元素检测、区间问题、矩阵处理等在内的常见题型及对应解法,为攻克数组/字符串类算法问题提供了系统指导。

2302_80918188的博客 795

字符串中出现次数最多的字符以及出现的次数

字符串:“448bbcccaaaa1111111***************”,找出出现次数最多的字符 解决办法:把字符串转换成字符数组,把出现的字符存到map中,出现的字符为key,次数为value,然后再在map中找到value最大的键值对,输出即可。 (思路源于http://blog.youkuaiyun.com/guyuealian/article/details/51933611) im...

sophie1314179的博客 930

(1)王道-数组-字符串

没有引用数组,但是数组可以被引用。eg:int &a[10];//错误 c风格的字符串 1)“acbd”//双引号括起来的字符串,因为末尾自动加了NULL,长度为5 2){‘a’,‘b’,’\0’}//末尾有‘\0’的字符数组 逗号运算 int a[3][2]={(0,1),(2,3),(3,4)}; int b[3][2]={1,3,4}; 数组a、b等价,元素都为 1,3,4,0,0,0 因为逗号运算只保留最后一个表达式的值(赋值运算优先级大于逗号运算 4. 二维数组a[x][y]=一位.

physicallayer的博客 212

字符串的排列&&数组中出现次数超过一半的数字

字符串的排列 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 解题思路 参考的别人的思路完成的(http://www.cnblogs.com/pmars/archive/2013/12/04/3458289.html) //这一段就是回溯法,这里以"abc"为例 ...

weixin_41676282的博客 370

【每日一题】【map、数组、二维数组排序、静态函数和库函数】2022年2月24日-NC97 字符串出现次数的TopK问题...

描述给定一个字符串数组,再给定整数 k ,请返回出现次数前k名的字符串和对应的次数。返回的答案应该按字符串出现频率由高到低排序。如果不同的字符串有相同出现频率,按字典序排序。对于两个字符串,大小关系取决于两个字符串从左到右第一个不同字符的 ASCII 值的大小关系。比如"ah1x"小于"ahb","231"<”32“字符仅包含数字和字母 答案: public String[][] ...

USTSD的博客 136

找出数组中出现次数最多的元素

最近朋友面试,看到一题面试题给大家分享一下。 题目是:一个长度为10000左右的字符串数组 var = ['aaa','bbb','ccc'...]请写出一个函数计算出现次数最多的字符串。 如果仅仅是用普通遍历来做的话就很不优雅了。因为数组长度是10000左右 在网上看到了这样一种方法 挺棒的。 function more(arr) { let max=n...

weixin_30797199的博客 500

转载文章 哈希求出现次数 转自小师兄

题述: 给出N个字符串(由恰好三位大写字母组成),再给出M个查询字符串,问每个查询字符串在N个字符串中出现的次数。 代码: #include const int max=100; char S[max][5], temp[5]; int hashTable[26 * 26 * 26+10]; //设置这种范围,大概是为了确保后面的id在这个范围内; //将字符串转化为整数 int hashFun...

qq_42265608的博客 199
上一篇: 计算MTF(SFR)的基本步骤,及sfrmat3和Mitre SFR 1.4进行比较
下一篇: opencv中怎么修改图像大小,增加几行
Traveling_DING
博客等级 码龄12年 65粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值