我试图编写的程序允许我输入10个数字,它应该告诉我数字X重复X次,依此类推。
我一直在尝试这个,但问题是我得到的结果如下:
例如...... {1,1,1,1,4,6,4,7,4}
数字1重复4次
数字1重复3次
数字1重复2次
数字1重复1次
数字4重复3次
数字6重复1次
数字4重复2次
数字7重复1次
数字4重复1次
问题在于它使用以下数字检查下一个数字而不跳过它,或者不知道它已经写过
#include <iostream>
#include <string>
using namespace std;
int main() {
int x[10];
for (int i=0;i<10;i++) {
cin>>x[i];
}
for (int i=0;i<9;i++) {
int count=1;
for (int j=i+1;j<10;j++) {
if (x[i]==x[j]) count++;
}
cout<<"The number "<<x[i]<<" is repeated "<<count<<" times"<<"\n";
}
}
答案 0 :(得分:3)
您的代码存在的问题是您重新处理已经处理过的数字。因此,如果位置0处出现1
而位置5出现1
,那么当您进入循环时,您将再次处理位置5处的1
。
因此,您需要一种方法来决定是否已经处理过某个号码。一种简单的方法是添加第二个数组(最初所有值都设置为0),每当处理数字时,您都标记该元素出现的所有位置。现在在处理元素之前,检查它是否已被处理,如果是这种情况则不执行任何操作。
另外,请尝试正确缩进代码:)
C ++代码:
int main( void ) {
const int N = 10;
int A[N];
for(int i = 0; i < N; i++)
cin >> A[i];
int seen[N];
for(int i = 0; i < N; i++)
seen[i] = 0;
for(int i = 0; i < N; i++) {
if(seen[i] == 0) {
int count = 0;
for(int j = i; j < N; j++)
if(A[j] == A[i]) {
count += 1;
seen[j] = 1;
}
cout << A[i] << " occurs " << count << " times" << endl;
}
}
return 0;
}
答案 1 :(得分:2)
这是使用std::map
的一个相当简单的实现。
#include <map>
#include <vector>
#include <cstdlib>
#include <iostream>
std::map<int, unsigned int> counter(const std::vector<int>& vals) {
std::map<int, unsigned int> rv;
for (auto val = vals.begin(); val != vals.end(); ++val) {
rv[*val]++;
}
return rv;
}
void display(const std::map<int, unsigned int>& counts) {
for (auto count = counts.begin(); count != counts.end(); ++count) {
std::cout << "Value " << count->first << " has count "
<< count->second << std::endl;
}
}
int main(int argc, char** argv) {
std::vector<int> mem = {1, 1, 1, 1, 4, 6, 4, 7, 4};
display(counter(mem));
return 0;
}
输出:
Value 1 has count 4
Value 4 has count 3
Value 6 has count 1
Value 7 has count 1
使用C ++ 14标准编译,但它也适用于C ++ 11。摆脱向量初始化器并使用auto
,它应该适用于C ++ 98。
答案 2 :(得分:0)
我最近遇到的最有效的方式......
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int array[10]={1,1,1,1,4,6,4,7,4};
int a[100];
memset(a,0,sizeof(a));
for(int i=0; i<sizeof(array)/sizeof(array[0]); i++)
{
a[array[i]]++;
}
for(int i=1; i<sizeof(a)/sizeof(a[0]); i++)
{
if(a[i]>0)
{
cout<<"The number "<<i<<"is repeated "<<a[i]<<" times"<<"\n";
}
}
输出:
The number 1 is repeated 4 times
The number 4 is repeated 3 times
The number 6 is repeated 1 times
The number 7 is repeated 1 times
答案 3 :(得分:0)
如果你已经知道数组中元素的可能值是什么,那么我的解决方案是有效的。例如,从0到9,从5到8,依此类推。我使用嵌套for循环来完成此任务。
Input 1 1 2 3 3 3 3
fstream fr("galbut.txt");
const int a = 7;
int M[a], P[a];
for(int x = 0; x< 7; x++)
{
fr >> M[x];
}
for (int x = 0; x < 3; x++) // x <3 because there are only 3 possible numbers (1,2,3)
{
P[x] = 0; // Set all elements in seperate array, on to which we will be writing the answers to be = 0.
for( int j = 0; j < 7; j++) // At the start, this loop basically checks whether each number is equal to 1/
{
if(M[j] == x +1) {P[x]++;} // If so, it adds +1 to the second array, starting from the 0th position.
//Then the loop checks whether each number is equal to 2 and if so, adds +1 to the other array in the 1st position now.
}
cout << P[x] << endl;
}
输出:2 1 4
答案 4 :(得分:0)
使用map
非常简单!
请参见Repl.it
#include <iostream>
#include <map>
int main()
{
int foo[]{1,1,1,1,4,6,4,7,4};
std::map<int, int> bar;
for (auto const &f : foo)
bar[f]++;
for (auto const &b : bar)
std::cout << "The number " << b.first
<< "is repeated " << b.second
<< "times\n";
}
预期输出:
The number 1 is repeated 4 times
The number 4 is repeated 3 times
The number 6 is repeated 1 times
The number 7 is repeated 1 times
答案 5 :(得分:0)
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cout<<"enter length of array:"<<endl;
cin>>n;
int arr[n];
for(int i=0;i<n;i++)
{
cout<<"enter element:";
cin>>arr[i];
}
sort(arr,arr+n);
/*this is for sort the array so we can find maximum element form user input and
using this element we make one array of that size
*/
int m=arr[n-1];
m++;
int a[m];
for(int i=0;i<m;i++)
{
a[i]=0;
}
for(int i=0;i<n;i++)
{
a[arr[i]]++;
}
cout<<endl;
for(int i=0;i<m;i++)
{
if(a[i]>0)
cout<<i<<"is repeat:"<<a[i]<<"time"<<endl;
}
}
输出如下:
输入数组长度:
6
输入元素:6
输入元素:5
输入元素:5
输入元素:6
输入元素:2
输入元素:3
2次重复:1次
3次重复:1次
5次重复:2次
6次重复:2次
答案 6 :(得分:0)
package DP;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class countsofRepeatedNumber {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[]= {1,1,1,1,4,4,6,4,7};
int n=arr.length;
countNumber(arr,n);
}
private static void countNumber(int[] arr, int n) {
TreeMap<Integer,Integer>list= new TreeMap<Integer,Integer>();
Arrays.sort(arr);
int count=1;
for(int i=0;i<n-1;i++) {
if(arr[i]==arr[i+1]) {
count++;
}else {
list.put(arr[i], count);
count=1;
}
}
list.put(arr[n-1], count);
printDatas(list);
}
private static void printDatas(TreeMap<Integer, Integer> list) {
for(Map.Entry<Integer, Integer>m:list.entrySet()) {
System.out.println("Item "+m.getKey()+": "+m.getValue());
}
}
}
答案 7 :(得分:0)
#include
答案 8 :(得分:0)
这段代码只需要 O(n) 时间和 O(1) 空间
#include
答案 9 :(得分:0)
#include <iostream>
#include<map>
using namespace std;
int main()
{
int arr[]={1,1,1,1,4,6,4,7,4};
int count=1;
map<int,int> mymap;
try
{
if(sizeof(arr)/sizeof(arr[0])<=1)
{
throw 1;
}
}
catch(int x)
{
cout<<"array size is not be 1";
return 0;
}
for(int i=0;i<(sizeof(arr)/sizeof(arr[0]));i++)
{
for(int j=i;j<(sizeof(arr)/sizeof(arr[0]));j++)
{
if(arr[i]==arr[j+1])
{
count++;
}
}
if(mymap.find(arr[i])!=mymap.end())
{
auto it = mymap.find(arr[i]);
if((it)->second<=count)
(it)->second=count;
count=1;
}
else if(count)
{
mymap.insert(pair<int,int>(arr[i],count));
count=1;
}
}
for(auto it=mymap.begin();it!=mymap.end();it++)
{
cout<<it->first<<"->"<<it->second<<endl;
}
return 0;
}
预期输出:
1->4
4->3
6->1
7->1