模拟index—数组查数字

题目描述

第一行输入一行整数,使用空格隔开。 第二行输入待查找的数字 a。 返回 a 出现的位置,如果有出现多个 a,则返回第一次出现的位置。 没有出现 a 则返回 -1

输入格式

第一行输入一行整数,使用空格隔开。 第二行输入一个整数。

输出格式

一个整数。

输入输出样例

输入

1 2 3 4 5 6 7 33 33 44 33

输出

8

说明/提示

33 第一次出现的位置为 8

#include<iostream>
using namespace std;
int main()
{
    int s[99];
    cin>>s[0];
    int a;
    int flag=0,index=1;
    char c;
    while(c=getchar()!='\n')
    {
        cin>>s[index];
        index++;
    }
    cin>>a;
    for(int i=0;i<index;i++){
        if(a==s[i])
        {
            flag=1;
            cout<<i+1;
            break;
        }
    }
    if(flag==0)
        cout<<"-1"<<endl;
    return 0;
}

本题重点在于第一行输入一行整数,使用空格隔开。可以先输入第一个数组,然后根据后面输入的符号进行判断是否继续输入,结束输入之后就可进行数字查找。

### 关于树状数组(Binary Indexed Tree) #### 定义 所谓树状数组,并不是真正意义上的树形结构,而是通过数组形式模拟的一种特殊的数据结构。这种数据结构利用数字的二进制表示方法对元素进行逻辑上的分层存储[^1]。 #### 特点 树状数组是一种能够高效处理前缀和询以及单点更新问题的数据结构,其询和修改的时间复杂度均为 \(O(\log n)\)[^2]。这使得树状数组非常适合用于解决涉及频繁区间求和及元素更改的问题场景。 #### 设计思想 设计上采用了巧妙的方式——基于二进制索引规则与位运算相结合的方法,在保持较低空间开销的同时实现了高效的动态数组更新和询功能[^3]。 #### Java 实现示例 下面给出一个简单的Java版本的树状数组实现: ```java public class BinaryIndexedTree1D { private final int[] bit; public BinaryIndexedTree1D(int size) { this.bit = new int[size + 1]; } /** * 更新指定位置处的值。 * * @param index 需要更新的位置(从1开始编号) * @param delta 变化量 */ public void update(int index, int delta) { while (index < bit.length) { bit[index] += delta; index += index & (-index); } } /** * 询给定位置之前的累积和。 * * @param index询的位置(从1开始编号) * @return 返回位置之前所有数之和 */ public int query(int index) { int sum = 0; while (index > 0) { sum += bit[index]; index -= index & (-index); } return sum; } } ``` 此代码片段展示了如何创建一个一维的树状数组类 `BinaryIndexedTree1D` ,并提供了两个核心函数:一个是用来增加某个特定下标的数值(`update`);另一个是用来计算到某一下标为止的所有数值总和(`query`)[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值