ACM基础试题及答案.docxVIP

  • 1
  • 0
  • 约5.07千字
  • 约 7页
  • 2026-03-12 发布于河北
  • 举报

ACM基础试题及答案

试题一:数组中的多数元素

题干

给定一个大小为n的整数数组nums,其中多数元素是指在数组中出现次数大于?n/2?的元素。假设数组是非空的,并且给定的数组总是存在多数元素。请找出这个多数元素。

输入示例:nums=[3,2,3]输出:3

输入示例:nums=[2,2,1,1,1,2,2]输出:2

提示:n的范围为[1,50000]

解答思路

本题最直观且高效的思路是“摩尔投票法”,核心逻辑是利用多数元素出现次数超过一半的特性:每次找出一对不同的元素并相互抵消,最后剩下的元素必然是多数元素。该方法时间复杂度O(n),空间复杂度O(1),适合大规模数组。

步骤拆解:

初始化两个变量,count记录当前候选元素的计数(初始为1),candidate记录候选元素(初始为数组第一个元素);

遍历数组从第二个元素开始:

若当前元素与candidate相同,count加1;

若不同,count减1;

当count减至0时,更新candidate为当前元素,同时将count重置为1;

遍历结束后,candidate即为多数元素(题目保证存在,无需额外校验)。

代码实现(C++)

cpp

#includeiostream

#includevector

usingnamespacestd;

intmajorityElement(vectorintnums){

intcandidate=nums[0];

intcount=1;

for(inti=1;inums.size();i++){

if(nums[i]==candidate){

count++;

}else{

count--;

if(count==0){

candidate=nums[i];

count=1;

}

}

}

returncandidate;

}

intmain(){

intn;

cinn;

vectorintnums(n);

for(inti=0;in;i++){

cinnums[i];

}

coutmajorityElement(nums)endl;

return0;

}

测试用例

测试用例1:输入3323→输出3

测试用例2:输入72211122→输出2

测试用例3:输入15→输出5

试题二:最长回文子串

题干

给定一个字符串s,找到s中最长的回文子串。回文子串是指正读和反读都一样的字符串,子串是字符串中连续的字符序列。

输入示例:s=babad输出:bab(或aba,两者均正确)

输入示例:s=cbbd输出:bb

提示:s的长度范围为[1,1000],s仅由数字和英文字母组成

解答思路

回文子串的核心特性是“中心对称”,因此采用“中心扩展法”最为直接(避免动态规划的额外空间消耗,且逻辑易理解)。思路是:以每个字符(奇数长度回文的中心)或两个相邻字符(偶数长度回文的中心)为起点,向左右两侧扩展,记录最大回文子串的起始位置和长度。

步骤拆解:

初始化两个变量,start记录最长回文子串的起始索引,maxLen记录最长长度(初始为1,因为单个字符必然是回文);

编写一个辅助函数expand,参数为左边界l和右边界r,功能是向左右扩展,返回当前回文子串的长度;

遍历字符串每个字符,对每个字符分别执行:

以当前字符为中心(奇数长度),调用expand(i,i);

以当前字符和下一个字符为中心(偶数长度),调用expand(i,i+1);

取两次扩展得到的最大长度,若大于maxLen,则更新maxLen和start;

遍历结束后,截取s从start开始、长度为maxLen的子串,即为结果。

代码实现(C++)

cpp

#includeiostream

#includestring

usingnamespacestd;

classSolution{

public:

stringlongestPalindrome(strings){

if(s.size()2)returns;

intstart=0,maxLen=1;

autoexpand=

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档