描述
小红拿到了一个仅由正整数组成的数组,她有以下两种操作:
1. 输入1 i x,代表将第i个正整数修改为x。
2. 输入2 i x,代表查询前i个正整数有多少个数等于x。输入描述:
第一行输入两个正整数n和q,代表数组长度和操作次数。
第二行输入n个正整数ai,代表初始的数组。
接下来的q行,每行输入三个正整数op,i,x,用空格隔开,其中op代表操作的类型,i和x的含义见题目描述。
1≤n,q,ai,x≤200
1≤op≤2
1≤i≤n
保证至少有1次询问操作。输出描述:
对于每次询问,输出一个整数,代表查询的结果。
示例1
输入:
5 3 1 2 3 4 5 2 3 1 1 1 2 2 3 1输出:
1 0说明:
第一次为查询操作,此时数组为[1,2,3,4,5],前三个数中有一个1。 第二次为修改操作,将数组修改为[2,2,3,4,5]。 第三次为查询操作,此时数组为[2,2,3,4,5],前三个数中没有1。
一、问题分析
首先读题,仔细看描述中的内容,发现需求是
1.有一个数组
2.可以对数组进行两种操作
3.第一种操作是将i位置的值修改为x
4.第二种操作是查询前i个位置中值等于x的数字有多少
5.输出查询结果
二、解题思路
1.首先读取数据
2.根据操作符号不同,对数组进行相关的操作
三、具体步骤
使用的语言是C
#include <stdio.h>
#include <stdlib.h>
int main() {int n, q;if (scanf("%d %d", &n, &q) != EOF) {// printf("n is %d q is %d\n", n, q);int* a = (int*)malloc(sizeof(int) * n);for(int i = 0; i < n; i++) {scanf("%d", &a[i]);}int op, i ,x;for(int time = 0; time < q; time++) {scanf("%d %d %d", &op, &i, &x);// printf("%d %d %d\n", op, i, x);if(op == 1) { // 代表是修改操作a[i - 1] = x;} else if(op == 2) { // 查询操作int count = 0;for(int j = 0; j < i; j++) {if(a[j] == x) count++;}printf("%d\n", count);} else {printf("error2");}}free(a);} else {printf("error");}return 0;
}