九度笔记之 1349:数字在排序数组中出现的次数

题目1349:数字在排序数组中出现的次数

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:919

解决:230

题目描述:
统计一个数字在排序数组中出现的次数。
输入:

每个测试案例包括两行:

第一行有1个整数n,表示数组的大小。1<=n <= 10^6。

第二行有n个整数,表示数组元素,每个元素均为int。

第三行有1个整数m,表示接下来有m次查询。1<=m<=10^3。

下面有m行,每行有一个整数k,表示要查询的数。

输出:
对应每个测试案例,有m行输出,每行1整数,表示数组中该数字出现的次数。

样例输入:
81 2 3 3 3 3 4 513
样例输出:
4

算法分析

      利用二分查找,分别查找某个数字在数组中第一次出现的位置和最后一次出现的位置。

       

源程序

        输入输入还是要用 scanf,printf 
        同时要考虑数组只有一个数的情况
       但是还有一个通不过,不知道为什么
//============================================================================
// Name        : judo1349.cpp
// Author      : wdy
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
//bisearch
#include <iostream>
#include <stdio.h>
using namespace std;
int num[1000001] = {0};
void init(int n){
    for(int i = 0;i<n;i++)
        scanf("%d",num+i);;
}
int findL(int b,int e,int value){
    if(b==e && value == num[0])
        return 1;
    if(b==e && value != num[0])
        return -1;
    int bid = b;
    int eid = e;
    int mid = bid + ((eid-bid)>>1);
    while(bid<eid-1){
        mid = bid + ((eid-bid)>>1);
        if(num[mid]>= value)
            eid = mid;
        else
            bid = mid;
    }
 
    if(num[bid]==value)
        return bid;
    else if(num[eid]==value)
        return eid;
    else
        return -1;//not found
}
int findR(int b,int e,int value){
 
    if(b==e && value == num[0])
        return 1;
    if(b==e && value != num[0])
        return -1;
 
    int bid = b;
    int eid = e;
    int mid = bid + ((eid-bid)>>1);
    while(bid<eid-1){
        mid = bid + ((eid-bid)>>1);
        if(num[mid]<= value)
            bid = mid;
        else
            eid = mid;
    }
 
    if(num[eid]==value)
        return eid;
    else if(num[bid]==value)
        return bid;
    else
        return -1;// not found
}
void test(){
    num[0] = 1;
    num[1] = 1;
    num[2] = 1;
    num[3] = 3;
    num[4] = 3;
 
    std::cout<<"L"<<findL(3,4,4)<<std::endl;
    std::cout<<"R"<<findR(3,4,4)<<std::endl;
}
 
void findValue(int b,int e,int value){
    std::cout<<findR(b,e,value)-findL(b,e,value)+1<<std::endl;
}
void judo(){
    int n;
    int m;
    int value;
    while(scanf("%d",&n) != EOF){
        init(n);
        scanf("%d",&m);
        while(m>0){
            scanf("%d",&value);
            findValue(0,n-1,value);
            m--;
        }
    }
}
int main() {
    //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    judo();
    return 0;
}
 
/**************************************************************
    Problem: 1349
    User: KES
    Language: C++
    Result: Wrong Answer
****************************************************************/


找到问题了,要考虑找不到的返回0

//============================================================================
// Name        : judo1349.cpp
// Author      : wdy
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
//bisearch
#include <iostream>
#include <stdio.h>
using namespace std;
int num[1000001] = {0};
void init(int n){
    for(int i = 0;i<n;i++)
        scanf("%d",num+i);;
}
int findL(int b,int e,int value){
    if(b==e && value == num[0])
        return 1;
    if(b==e && value != num[0])
        return -1;
    int bid = b;
    int eid = e;
    int mid = bid + ((eid-bid)>>1);
    while(bid<eid-1){
        mid = bid + ((eid-bid)>>1);
        if(num[mid]>= value)
            eid = mid;
        else
            bid = mid;
    }
 
    if(num[bid]==value)
        return bid;
    else if(num[eid]==value)
        return eid;
    else
        return -1;//not found
}
int findR(int b,int e,int value){
 
    if(b==e && value == num[0])
        return 1;
    if(b==e && value != num[0])
        return -1;
 
    int bid = b;
    int eid = e;
    int mid = bid + ((eid-bid)>>1);
    while(bid<eid-1){
        mid = bid + ((eid-bid)>>1);
        if(num[mid]<= value)
            bid = mid;
        else
            eid = mid;
    }
 
    if(num[eid]==value)
        return eid;
    else if(num[bid]==value)
        return bid;
    else
        return -1;// not found
}
void test(){
    num[0] = 1;
    num[1] = 1;
    num[2] = 1;
    num[3] = 3;
    num[4] = 3;
 
    std::cout<<"L"<<findL(3,4,4)<<std::endl;
    std::cout<<"R"<<findR(3,4,4)<<std::endl;
}
 
void findValue(int b,int e,int value){
       int R = findR(b,e,value);
       int L = findL(b,e,value);
       if( R>0)
          std::cout<<R-L+1<<std::endl;
        else
              std::cout<<0<<std::endl;
}
void judo(){
    int n;
    int m;
    int value;
    while(scanf("%d",&n) != EOF){
        init(n);
        scanf("%d",&m);
        while(m>0){
            scanf("%d",&value);
            findValue(0,n-1,value);
            m--;
        }
    }
}
int main() {
    //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    judo();
    return 0;
}
/**************************************************************
    Problem: 1349
    User: KES
    Language: C++
    Result: Wrong Answer
****************************************************************/


结果


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,根据提供的引用内容,我无法回答关于西北工业大学计算机考研真题在百度云上的问题。引用提供了一个关于字符串合并的样例输入和输出,而引用和引用提供了一些与西北工业大学计算机研究生的相关信息。但是,这些引用内容都没有提供与百度云相关的信息。如果您有关于其他方面的问题,我将很乐意为您提供帮助和回答。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [九度OJ 题目1471:合并符串](https://blog.csdn.net/SJF0115/article/details/8609716)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [2021西北工业大学考研历年真题](https://blog.csdn.net/weixin_42502288/article/details/118177726)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [undefined](undefined)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值