目录
在字符串中找出连续最长的数字
链接:
字符串中找出连续最长的数字串_好未来笔试题_牛客网 (nowcoder.com)
来源:牛客网
读入一个字符串str,输出字符串str中的连续最长的数字串
输入描述:
个测试输入包含1个测试用例,一个字符串str,长度不超过255。
输出描述:
在一行内输出str中里连续最长的数字串。
示例1
输入
abcd12345ed125ss123456789输出
123456789
首先理解题意
读入一个字符串str,输出字符串str中的连续最长的数字串
意思就是给一串字符串,遍历然后输出连续的数字
怎么做
直接上代码
#include <iostream>
#include <string>
using namespace std;
int main(){
string str, cur, ret;//创建三个数组
cin >> str;//输入
for(int i = 0; i <= str.length(); ++i){
if(str[i] > '0' && str[i] <= '9'){
cur += str[i];//遍历数组,遇到1到9的字符保存到cur
}else{
if(cur.size() > ret.size()){//比较俩个数组的大小
ret = cur;//小于则放进ret中
}else{
cur.clear();//若没有则清空cur的内容继续遍历
}
}
}
cout << ret <<endl;
return 0;
}
数组中出现次数超过一半的数字
链接:数组中出现次数超过一半的数字__牛客网
来源:牛客网
给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
数据范围:n≤50000n \le 50000n≤50000,数组中元素的值 0≤val≤100000 \le val \le 100000≤val≤10000
要求:空间复杂度:O(1)O(1)O(1),时间复杂度 O(n)O(n)O(n)
输入描述:
保证数组输入非空,且保证有解
示例1
输入
[1,2,3,2,2,2,5,4,2]输出
2示例2
输入
[3,3,3,3,2,2,2]输出
3示例3
输入
[1]输出
1
理解题意
给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字
超出一半排序后中间的元素必定是这个数字
解题
直接上代码
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
if(numbers.empty()){//判空
return 0;
}
sort(numbers.begin(), numbers.end());//进行排序
int mid = numbers[numbers.size() / 2];//拿到中间的数字
int count = 0;//计数器
for(int i = 0; i < numbers.size();i++){
if(mid == numbers[i]){//遍历数组寻找和中间那个数一样的
count++;//找到给计数器++
}
}
//如果输出的长度大于数组的一半那么就输出这个数字,如果没有就输出0
return count > numbers.size() / 2 ? mid : 0;
}
};
这里的时间复杂度太高为O(NlogN)并非最优解
那么我们看另外一种解法
上代码
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
if(numbers.empty()){//判空
return 0;
}
int result = numbers[0];//拿到第一个数字保存到result
int times = 1; //让times置为1
// 遍历每个元素,并记录次数;若与前一个元素相同,则次数加1,否则次数减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;
}
}
times = 0;
for(int i = 0; i <numbers.size(); ++i){//判断result是否为非众数
if(numbers[i] = result){
++times;
}
}
return (times > numbers.size()/2) ? result : 0;
}
};