一、选择题
eg1
eg2
eg3
eg4
eg5
二、编程题
eg1
【解题思路】:
遍历字符串,使用cur去记录连续的数字串,如果遇到不是数字字符,则表示一个连续的数字串结束了,则将数字串跟之前的数字串比较,如果更长,则更新更长的数字串更新到ret。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
cin >> s;
string cur;
string ret;
//<= s.size();防止出现abcd12345ed125ss123456789
for(int i = 0; i <=s.size(); ++i)
{
//如果是数字字符就插入cur
if('0' <= s[i] && s[i] <= '9')
{
cur += s[i];
}
else
{
//判断cur的长度是否大于ret的长度
if(cur.size() > ret.size())
{
ret = cur;
}
//清空cur
cur.clear();
}
}
cout << ret << endl;
return 0;
}
eg2
【解题思路1】:
思路一:数组排序后,如果符合条件的数存在,则一定是数组中间那个数。这种方法虽然容易理解,但由于涉及到快排sort,其时间复杂度为O(NlogN)并非最优
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers)
{
sort(numbers.begin(), numbers.end());
int index = numbers.size() / 2;
return numbers[index];
}
};
【解题思路2】:
众数:就是出现次数超过数组长度一半的那个数字如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers)
{
int result = numbers[0];
int times = 1;
for(int i = 1; i < numbers.size(); ++i)
{
if(times != 0)
{
if(result == numbers[i])
{
++times;
}
else
{
--times;
}
}
else
{
result = numbers[i];
times = 1;
}
}
return result;
}
};