最新一道面試題目,input: int[1,1,2,2,2,3,3,3],output [3,2,1],要求按照數字出現的次數從多到少排列元素。
面試當時沒有及時答出來,感覺當時在面試官的提示下跑偏了。想用兩個數組來mapping key和value然後對等排序,但是因為面試官讓用Array.sort而沒想好有什麼好辦法,結果可想而知。但是題目還是要做的,所以,先研究一下這個題目。發現中文搜索沒有找到對應的題目,leetcode上面也沒找到,用英文的找到了怎麼給HashMap按照key和value分別排序的解法。先這樣解決一下。如果誰有更好的解法,歡迎分享。
今天學習到了Java8裡面的簡單寫法,先貼這裡,回家debug一下。
Map<String, Integer> result2 = new LinkedHashMap<>();
map.entrySet().stream()
.sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
.forEachOrdered(x -> result2.put(x.getKey(), x.getValue()));
把第一種解法這樣改就可以了:
public static int[] countSort(int[] nums){
if(nums == null || nums.length ==0)
return null;
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i = 0; i < nums.length; i++){
if(map.containsKey(nums[i]))
map.put(nums[i], map.get(nums[i]) + 1);
else
map.put(nums[i], 1);
}
Map<Integer, Integer> resultMap = new LinkedHashMap<>();
map.entrySet().stream()
.sorted(Map.Entry.<Integer, Integer>comparingByValue().reversed())
.forEachOrdered(x -> resultMap.put(x.getKey(), x.getValue()));
int[] result = new int[resultMap.size()];
int i = 0;
for(Map.Entry<Integer, Integer> entry : resultMap.entrySet()){
result[i++] = entry.getKey();
}
return result;
}
package ArraySort; import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map; public class ArraySort {
public static int[] countSort(int[] nums){
if(nums == null || nums.length ==0)
return null;
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); for(int i = 0; i < nums.length; i++){
if(map.containsKey(nums[i]))
map.put(nums[i], map.get(nums[i]) + 1);
else
map.put(nums[i], 1);
} HashMap<Integer, Integer> resultMap = sortByValue(map); int[] result = new int[resultMap.size()];
int i = 0;
for(Map.Entry<Integer, Integer> entry : resultMap.entrySet()){
result[i++] = entry.getKey();
} return result;
} private static <K, V extends Comparable<? super V>> HashMap<K, V> sortByValue( Map<K, V> map ){
List<Map.Entry<K, V>> list = new LinkedList<>(map.entrySet());
Collections.sort( list, new Comparator<Map.Entry<K, V>>(){
@Override
public int compare( Map.Entry<K, V> o1, Map.Entry<K, V> o2)
{
return ( o2.getValue() ).compareTo( o1.getValue() );
}
} ); HashMap<K, V> result = new LinkedHashMap<>();
for (Map.Entry<K, V> entry : list)
{
result.put( entry.getKey(), entry.getValue() );
}
return result;
} public static void main(String[] args) {
int[] nums = {2,2,2,2,2,1,1,3,3,3,3};
int[] result = countSort(nums); for(int i = 0; i < result.length; i++)
System.out.println(result[i]);
}
} 下面是调试好的,用二维数组来排序的方式解决问题。
package ArraySort; import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set; public class ArraySort {
public static int[] countSort(int[] nums){
if(nums == null || nums.length ==0)
return null;
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); for(int i = 0; i < nums.length; i++){
if(map.containsKey(nums[i]))
map.put(nums[i], map.get(nums[i]) + 1);
else
map.put(nums[i], 1);
} int[][] mapNums= new int[map.size()][2]; Set entries = map.entrySet();
Iterator entriesIterator = entries.iterator(); int i = 0;
while(entriesIterator.hasNext()){ Map.Entry mapping = (Map.Entry) entriesIterator.next(); mapNums[i][0] = (int)mapping.getKey();
mapNums[i][1] = (int)mapping.getValue(); i++;
} int[][] resultMap = sort(mapNums); int[] result = new int[map.size()]; for(int p = 0; p < resultMap.length; p++){
result[p] = resultMap[p][0];
}
return result;
} public static int[][] sort(int[][] arr){
int arr1[] = new int[2];
for(int i = 0; i < arr.length; i++){
for(int j = i; j < arr.length; j++){
if(arr[i][1] < arr[j][1]){
arr1 = arr[i];
arr[i] = arr[j];
arr[j] = arr1;
}
}
} return arr;
} // private static <K, V extends Comparable<? super V>> HashMap<K, V> sortByValue( Map<K, V> map ){
// List<Map.Entry<K, V>> list = new LinkedList<>(map.entrySet());
// Collections.sort( list, new Comparator<Map.Entry<K, V>>(){
// @Override
// public int compare( Map.Entry<K, V> o1, Map.Entry<K, V> o2)
// {
// return ( o2.getValue() ).compareTo( o1.getValue() );
// }
// } );
//
// HashMap<K, V> result = new LinkedHashMap<>();
// for (Map.Entry<K, V> entry : list)
// {
// result.put( entry.getKey(), entry.getValue() );
// }
// return result;
// } public static void main(String[] args) {
int[] nums = {2,2,2,2,2,1,1,3,3,3,3};
int[] result = countSort(nums); for(int i = 0; i < result.length; i++)
System.out.println(result[i]);
}
}
最新一道面試題目,input: int[1,1,2,2,2,3,3,3],output [3,2,1],要求按照數字出現的次數從多到少排列元素。的更多相关文章
- 一個新的面試題目,leetcode上面可以找到shortest palindrome
記錄一下新的面試題目,其實題目是舊的,只是我才見到.以前研究過,只不過以前的解法不容易理解,現在有了新的遞歸解法.記錄一下. public String shortestPalindrome(Stri ...
- spring框架面試題目
25个经典的Spring面试问答 这是在网上下载的面试题,忘记了出处,如带来不便联系本人立马删除,在这里提供给将要面试的朋友,与大家分享,希望能给您带来帮助! 问题清单: 1. 什么是Spring框架 ...
- List查询重复值的个数,并根据重复的数目从多到少排列
package ttt; import java.nio.MappedByteBuffer; import java.util.ArrayList; import java.util.Collecti ...
- [亂數] <細說> C/C++ 亂數基本使用與常見問題
陸陸續續寫了 EA 一.二年,以前亂數引導文回頭看時才發現,怎麼有這麼多細節的錯誤.沒系統. 這篇文章主要引導初學者使用亂數,同時附上常被翻出來討論的議題,C/C++適用,唯以 C 語言撰之. 也由 ...
- PMP全真模拟题真题試題含答案解析 2019年下半年PMP考試适用 PMP中文文对照试题 【香港台灣地區PMP考試也可用】
PMP全真模拟题真题试题 含答案解析 2019年下半年PMP考试适用 PMP中文文对照试题 [香港台灣地區PMP考試也可用]PMP全真模擬題真題試題 含答案解析 2019年下半年PMP考試适用 PMP ...
- 给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)
""" #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 解题思路: 1.设定一个 ...
- 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...
- js数组操作-找出一组按不同顺序排列的字符串的数组元素
从一组数组中找出一组按不同顺序排列的字符串的数组元素将字符串转换成数组后再对数组进行 sort 排序,abcd 和 bdca 使用 sort 排序后会变成 abcd,将拍好序的字符串作为对象的 key ...
- 根据当前设备的宽度,动态计算出rem的换算比例,实现页面中元素的等比缩放
~function anonymous(window){ //根据当前设备的宽度,动态计算出rem的换算比例,实现页面中元素的等比缩放 let computedREM = function compu ...
随机推荐
- 【DP】【构造】NOIp模拟题 演讲 题解
极其考思维的好题 题目背景 众所周知,$\mathrm{Zdrcl}$是一名天天$\mathrm{AK}$的高水平选手. 作为一民长者,为了向大家讲述自己$\mathrm{AK}$的经验,他决 ...
- Tensorlflow-解决非线性回归问题
import tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt #使用numpy生成200个随机点,范围从-0.5到0 ...
- HDU 6301 (贪心+优先队列)
题目大意: 求一个长度为n的数列, 给出m个区间,这m个区间各自区间内的数不同 题解: 用优先队列来模拟过程 , 解题思路是想到了 , 可是不知道如何实现 , 果然还须继续努力呀 这道题思路是去掉重复 ...
- 破解mysql数据库的密码
发现的1小问题 语句打错以后应该退出本语句,再继续打新语句.也可以打\c,退出本语句. 如何破解数据库的密码: 1:通过任务管理器或者服务管理,关掉mysqld(服务进程) 2:通过命令行+特殊参数开 ...
- 磁盘挂载 fdisk
fdisk -l 查看是否 已加入磁盘 fdisk /dev/sdb fdisk -cu /dev/sdb 取消兼容模式 添加一个硬盘,只创建一个分区,然后把分区挂载到/data 第 ...
- PIE SDK图片元素的绘制
1. 功能简介 在数据的处理中会用到图片元素的绘制,利用IPictureElement图片元素接口进行绘制,目前PIE SDK支持IPictureElement元素接口的绘制,下面对图片元素的绘制进行 ...
- VI设计对于企业文化建设的重要性
VI设计对于企业文化建设非常重要,包括企业品牌形象塑造.企业价值提炼.企业文化建设等有着非常重要的作用.VI设计的发展趋势是什么? 第一 从静态到动态 中国过去一段时间以来的VI设计,也是以一种静止和 ...
- oracle 笔记---(一)
+查看主节点和副节点 oclumon manage -get MASTER REPLICA +查看当前的统计信息和保存的时间段 oclmon manage -get repsize +收集时间段内的节 ...
- Lua初探
官方网站:http://www.lua.org/ 三方模块:https://luarocks.org/ 介绍安装luarocks语法注释标示符关键字全局变量数据类型变量赋值索引循环流程控制函数可变 ...
- 关于GitHub在VS中出现“已经存在master版本,无法……”的错误解决方案
引用:http://www.cnblogs.com/SmallZL/p/3637613.html(这篇已经很详细说明如何使用Vs+GitHub),我这里做补充: VS2013已经集成了Git一部分控件 ...