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