中兴笔试排序题求解答

给定一组数,按照数组中出现的次数依次从大到小排序,出现次数一样的按照数组中的先后顺序输出 比如: 
输入:1 1 1 1 3 3 3 4 5 2 6 6 6 6 6
输出:6 6 6 6 6 1 1 1 1 3 3 3 4 5 2

求代码共享!

我的输出:
6 6 6 6 6 1 1 1 1 3 3 3 5 4 2
我知道是map底层排序不稳定排序的原因,但是不知道怎么解决,求解决!

代码如下:
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>

using namespace std;

bool compare(pair<int, int> lhs, pair<int, int>rhs)
{
	return lhs.second>rhs.second;
}

int main()
{

	while (1)
	{
		vector<int> vec;
		map<int, int> m;
		int num;
		cout << "输入数组元素的个数:";
		cin >> num;

		//输入数组并计数
		int i;
		for (i = 0; i<num; i++)
		{
			int temp;
			cin >> temp;
			vec.push_back(temp);
			if (m.find(temp) == m.end())
				m.insert(make_pair(temp, 1));
			else
				m[temp]++;
		}
		vector<pair<int,int> > res;
		for (i=0;i<num;i++)
		{
			if(find(res.begin(),res.end(),make_pair(vec[i],m[vec[i]]))==res.end())
				res.push_back(make_pair(vec[i],m[vec[i]]));
		}
		stable_sort(res.begin(),res.end(),compare);

		for(vector<pair<int,int> >::iterator it=res.begin();it!=res.end();it++)
			for(i=0;i<it->second;i++)
				cout<<it->first<<" ";
		cout<<endl;
	}
	return 0;
}

全部评论
#include<iostream> #include<vector> #include<algorithm> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int in[] = { 1, 1, 1, 1, 3, 3, 3, 4, 5, 2, 6, 6, 6, 6, 6 }; vector<pair<int, int>> test; for (int i = 0; i < sizeof(in) / sizeof(int); i++) { auto it = test.begin(); for (; it != test.end(); it++) { if (it->first == in[i]) { it->second++; break; } } if (it == test.end()) { test.push_back(make_pair(in[i], 1)); } } stable_sort(test.begin(), test.end(), [](pair<int, int> fr, pair<int, int> bc){return fr.second > bc.second; }); for (auto i = 0; i < test.size() - 1; i++) { for (int j = 0; j < test[i].second; j++) { cout << test[i].first << " "; } } if (test.size()>0) { for (int i = 0; i < test[test.size() - 1].second-1; i++) { cout << test[test.size() - 1].first << " "; } cout << test[test.size() - 1].first << endl; } return 0; } 用stable_sort就可以吧
点赞 回复 分享
发布于 2016-08-26 19:27
//用lambda void Sortbytimes(vector<int> A) {  int len = A.size();  map<int, int> res;  for (int i = 0;i < len;i++)  {   auto ret = res.insert({ A[i],1 });   if (ret.second == false)    res[A[i]]++;  }  stable_sort(A.begin(), A.end(), [res](const int& a, const int& b) {return  res.at(a)>res.at(b);});;  for (auto a : A)   cout << a << " "; }
点赞 回复 分享
发布于 2016-08-26 19:28
用桶排序吧。简洁多了
点赞 回复 分享
发布于 2016-08-26 18:19
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; public class TestZTE { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); while (sc.hasNext()) { String s = sc.nextLine(); sort(s); } } private static void sort(String s) { String[] str = s.split(" "); // System.out.println(str.length); Map<String, Integer> map = new LinkedHashMap<String, Integer>(); List<Entry<String, Integer>> list = new ArrayList<>(); for (int i = 0; i < str.length; i++) { if (!map.containsKey(str[i])) { map.put(str[i], 1); } else { map.put(str[i], map.get(str[i]) + 1); } } for (Entry<String, Integer> entry : map.entrySet()) { list.add(entry); } Collections.sort(list, new Comparator<Entry<String, Integer>>() { @Override public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { // TODO Auto-generated method stub return o2.getValue() - o1.getValue(); } }); StringBuffer sb = new StringBuffer(); for (Entry<String, Integer> list1 : list) { for (int i = 0; i < list1.getValue(); i++) { sb.append(list1.getKey()).append(" "); } } System.out.println(sb.toString().trim()); } }
点赞 回复 分享
发布于 2016-08-26 18:45
我只想到这种效率比较低的 import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Scanner; import java.util.Set; public class Main {  public static void main(String[] args) {   Scanner sc=new Scanner(System.in);   String line=sc.nextLine();   String[] str=line.split(" ");   int n=str.length;   int[] array=new int[n];   for(int i=0;i<n;i++){    array[i]=Integer.parseInt(str[i]);   }   mySort(array);       }  private static void mySort(int[] array) {   LinkedHashMap<Integer,Integer> map=new LinkedHashMap<>();      int len=array.length;      for(int i=0;i<len;i++){    if(map.get(array[i])==null){     map.put(array[i], 1);    }else{     int count=map.get(array[i]);     count++;     map.put(array[i], count);    }   }        Set<Integer> key=map.keySet();   int n=key.size();   int[] value=new int[n];   int j=0;   for(int k:key){    value[j]=map.get(k);    j++;   }      Arrays.sort(value);      for(int i=n-1;i>=0;i--){    for(int k:key){     if(value[i]==map.get(k)){      for(int z=0;z<value[i];z++){       System.out.print(k);       System.out.print(" ");      }      map.put(k, 0);     }    }   }     } }
点赞 回复 分享
发布于 2016-08-26 20:33
每个数再增加一个"第一次出现的位置"这个属性,这样排序的时候,先根据每个数出现的次数排序,相同时再根据每个数第一次出现的位置排序。
点赞 回复 分享
发布于 2016-08-26 16:14
代码过于繁琐,不是很给力。。。
点赞 回复 分享
发布于 2016-08-26 18:06
原数组再遍历一遍不就行了么
点赞 回复 分享
发布于 2016-08-26 18:15
#include<iostream> #include<vector> #include<string> #include <algorithm> using namespace std; bool cmp_by_value(pair<int, int> lhs, pair<int, int>rhs) { return lhs.second > rhs.second; } int main() { vector<int> vec; string str; getline(cin,str); while(true) { if(str.find_first_of(' ')!=string::npos) { string strTmp=str.substr(0, str.find_first_of(' ')); vec.push_back(atoi(strTmp.c_str())); str = str.substr(str.find_first_of(' ')+1, str.size()); } else { vec.push_back(atoi(str.c_str())); break; } } vector<int> v=vec; vector<int>::iterator iter = v.begin(); while(iter != v.end()){ if(iter != find(v.begin(),iter,*iter)){ iter = v.erase(iter); continue; } iter++; } vector<pair<int,int> >new_vec; for (int i=0;i<v.size();i++) { new_vec.push_back(make_pair<int,int>(v[i],count(vec.begin(),vec.end(),v[i]))); } sort(new_vec.begin(), new_vec.end(), cmp_by_value); for (int i = 0; i != new_vec.size(); ++i) { int count=new_vec[i].second; for (int j=0;j<count;j++) { cout<<new_vec[i].first<<" "; } } cout<<endl; return 0; }
点赞 回复 分享
发布于 2016-08-26 21:44
public static void main(String[] args) { // TODO Auto-generated method stub      int []arr={1, 1, 1, 1, 3, 3, 3, 4, 5, 2 ,6, 6, 6, 6, 6};      int[]hasArray=new int[arr.length+1];      int maxLength=0;      for(int i=0;i<arr.length;i++)      {     hasArray[arr[i]%hasArray.length]+=1;     maxLength=hasArray[arr[i]%hasArray.length]>maxLength?hasArray[arr[i]%hasArray.length]:maxLength;      }      while(maxLength>=1)      {     for(int i=0;i<arr.length;i++)     {     if(hasArray[arr[i]%hasArray.length]==maxLength)     {     System.out.print(arr[i]%hasArray.length+" ");     }         }     maxLength--;      } }
点赞 回复 分享
发布于 2016-08-26 22:42
可以用stable_sort()吗,自己定义个compare,针对map里面键值对的第二项(就是出现次数)来排序。
点赞 回复 分享
发布于 2016-08-26 23:11
//用的linkedhashmap import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; public class Main { public static void sort(int[] num){ LinkedHashMap<Integer, Integer> map=new LinkedHashMap<>(); for (int i = 0; i < num.length; i++) { if (map.containsKey(num[i])) { map.put(num[i], map.get(num[i])+1); } else { map.put(num[i], 1); } } List<Map.Entry<Integer, Integer>> list=new ArrayList<>(map.entrySet()); Collections.sort(list,new Comparator<Map.Entry<Integer, Integer>>() { public int compare(Entry<Integer, Integer>o1,Entry<Integer, Integer>o2){ return o2.getValue().compareTo(o1.getValue()); } }); List<Integer> list1=new ArrayList<>(); List<Integer> list2=new ArrayList<>(); for(Entry<Integer, Integer> mapp:list){ list1.add(mapp.getKey()); list2.add(mapp.getValue()); } int[] newnum=new int[num.length]; int j=0; int index=0; for (int i = 0; i < list2.size(); i++) { while(index<list2.get(i)){ newnum[j]=list1.get(i); j++; index++; } index=0; } for (int i = 0; i < newnum.length; i++) { System.out.println(newnum[i]); } } public static void main(String[] args) { int[] num={1,1,1,2,3,3,4}; sort(num); } }
点赞 回复 分享
发布于 2016-08-30 21:05
int main() { int A[]={1 ,1, 1, 1, 3, 3, 3, 4, 5, 2, 6, 6, 6, 6, 6 }; int len =sizeof(A)/sizeof(int); int ha[100]={0}; for(int i=0;i<len;i++) { ha[A[i]]++; } int i=0,j=0; int a[100][2]; for(int i=0;i<100;i++) { if(ha[i]!=0) { a[j][0]=i; a[j++][1]=ha[i]; } } int lena=j; for(int i=0;i<lena-1;i++)//冒泡排序 { for(int j=0;j<lena-1-i;j++) { if(a[j][1]<a[j+1][1])// { int t=a[j][1]; int d=a[j][0]; a[j][1]=a[j+1][1]; a[j][0]=a[j+1][0]; a[j+1][1]=t; a[j+1][0]=d; } if(a[j][1]==a[j+1][1])//若相等 { int d1=a[j][0]; int d2=a[j+1][0]; int k; for(k=0;k<len&&(A[k]!=d1)&&(A[k]!=d2);k++) { int aaa=k; } int d=A[k]; if (d2==d) { int t=a[j][1]; int dd=a[j][0]; a[j][1]=a[j+1][1]; a[j][0]=a[j+1][0]; a[j+1][1]=t; a[j+1][0]=dd; } } } } for (int i=0;i<lena;i++) { int num=a[i][1]; for(int j=0;j<num;j++) { cout<<a[i][0]<<' '; } } }
点赞 回复 分享
发布于 2016-09-03 21:46
思路比较繁琐,没仔细思考 仅仅实现了功能 #include <iostream> #include <vector> #include <map> #include <set> #include <algorithm> using namespace std; bool cmp(pair<int, int> a, pair<int, int> b) {     return a.second > b.second; } int main() {     vector<int> v {1,1,1,1,3,3,3,4,5,2,6,6,6,6,6};     map<int, int> m;     for(int i = 0; i < v.size(); ++i)     {         if(m.find(v[i]) == m.end())         {             m.insert(make_pair(v[i], 1));         }         else         {             ++m[v[i]];         }     }     vector<pair<int, int>> res;     set<int> s;     for(int i = 0; i < v.size(); ++i)     {         if(s.find(v[i]) == s.end())         {             res.push_back(make_pair(v[i], m[v[i]]));             s.insert(v[i]);         }     }     stable_sort(res.begin(), res.end(), cmp);     for(int i = 0; i < res.size(); ++i)     {         for(int j = 0; j < res[i].second; ++j)         {             if(i == res.size() - 1 && j == res[i].second - 1)             {                 cout << res[i].first << endl;             }             else             {                 cout << res[i].first << " ";             }         }     } }
点赞 回复 分享
发布于 2016-09-04 12:03

相关推荐

努力学习的小绵羊:我反倒觉得这种挺好的,给不到我想要的就别浪费大家时间了
点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
评论
点赞
29
分享
牛客网
牛客企业服务