C++每日练题(3)

目录

在字符串中找出连续最长的数字

数组中出现次数超过一半的数字


在字符串中找出连续最长的数字

链接: 

字符串中找出连续最长的数字串_好未来笔试题_牛客网 (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;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值