C++ 查询以回答给定索引左侧的 1 和 0 的数量
讨论一个问题来回答对给定数组的查询。例如,对于每个查询索引,我们需要找到索引左侧的1和0的数量。
Input: arr[ ] = { 0, 1, 1, 1, 0, 0, 0, 1, 0, 0}, queries[ ] = { 2, 4, 1, 0, 5 }
Output:
query 1: zeros = 1,ones = 1
query 2: zeros = 1,ones = 3
query 3: zeros = 1,ones = 0
query 4: zeros = 0,ones = 0
query 5: zeros = 2,ones = 3
Input: arr[ ] = { 0, 0, 1, 1, 1, 0, 1, 0, 0, 1 }, queries[ ] = { 3, 2, 6 }
Output:
query 1: zeros = 2,ones = 1
query 2: zeros = 2,ones = 0
query 3: zeros = 3,ones = 3寻找解决方案的方法
天真的方法
解决这个问题的简单方法是遍历数组到查询的索引并检查每个元素;如果为0,则将零计数器加1,否则,将个计数器加1。
示例
#include <bits/stdc++.h>
using namespace std;
int main(){
int nums[] = {1, 0, 0, 1, 1, 0, 0, 1, 0, 0};
int queries[] = { 2, 4, 1, 0, 5 };
int qsize = sizeof(queries) / sizeof(queries[0]);
int zeros=0,ones=0;
//循环运行每个查询。
for(int i = 0;i<qsize;i++){
//计数零和一
for(int j = 0;j<queries[i];j++){
if(nums[j]==0)
zeros++;
else
ones++;
}
cout << "\nquery " << i+1 << ": zeros = " << zeros << ",ones = " << ones;
zeros=0;
ones=0;
}
return 0;
}输出结果query 1: zeros = 1,ones = 1 query 2: zeros = 2,ones = 2 query 3: zeros = 0,ones = 1 query 4: zeros = 0,ones = 0 query 5: zeros = 2,ones = 3
有效的方法
在之前的方法中,我们每次都为第0个索引的新查询计算1和0。
另一种方法是首先计算每个索引左侧的零和一,将它们存储在一个数组中,然后根据查询中写入的索引返回答案。
示例
#include <bits/stdc++.h>
using namespace std;
int main(){
int nums[] = {1, 0, 0, 1, 1, 0, 0, 1, 0, 0};
int queries[] = { 2, 4, 1, 0, 5 };
int n = sizeof(nums) / sizeof(nums[0]);
int arr[n][2];
int zeros = 0, ones = 0;
//遍历nums数组。
for (int i = 0; i < n; i++) {
//将0和1的数量存储在arr中。
arr[i][0] = zeros;
arr[i][1] = ones;
//根据条件增加变量
if (nums[i]==0)
zeros++;
else
ones++;
}
int qsize = sizeof(queries) / sizeof(queries[0]);
for (int i = 0; i < qsize; i++)
cout << "\nquery " << i+1 << ": zeros = " << arr[queries[i]][0] << ",ones =" << arr[queries[i]][1];
return 0;
}输出结果query 1: zeros = 1,ones =1 query 2: zeros = 2,ones =2 query 3: zeros = 0,ones =1 query 4: zeros = 0,ones =0 query 5: zeros = 2,ones =3
结论
在本教程中,我们讨论了为给定数组中的每个查询返回索引左侧的1和0的数量。我们讨论了一种简单的方法和一种有效的方法来解决这个问题。我们还讨论了针对这个问题的C++程序,我们可以使用C、Java、Python等编程语言来解决这个问题。我们希望本教程对您有所帮助。