森林中的兔子
一、題目描述
森林中,每一個兔子都有顏色。其中一些兔子(多是所有)告訴你還有多少其餘的兔子和本身有相同的顏色。咱們將這些回答放在 answers 數組裏。
返回森林中兔子的最少數量。
示例:
輸入: answers = [1, 1, 2]
輸出: 5
解釋:
兩隻回答了 "1" 的兔子可能有相同的顏色,設爲紅色。
以後回答了 "2" 的兔子不會是紅色,不然他們的回答會相互矛盾。
設回答了 "2" 的兔子爲藍色。
此外,森林中還應有另外 2 只藍色兔子的回答沒有包含在數組中。
所以森林中兔子的最少數量是 5: 3 只回答的和 2 只沒有回答的。
輸入: answers = [10, 10, 10]
輸出: 11
輸入: answers = []
輸出: 0
二、算法思想
算法思想:
一、把喊到相同個數的兔子拎出來,讓他們一組,按照他們說的那個數目分配,比方說:有10只兔子說了,和他們相同的有3只相同的,那麼咱們能夠4只4只一組,所以,咱們就能夠劃分爲4,4,2,最後一個2個不足4個,不符合條件,因此說明咱們須要再添加2個
也就是 ⌈(該顏色兔子的總個數)/(兔子一組須要的個數)⌉ *(兔子的組數)
二、將全部顏色兔子的個數進行相加
代碼思想:
一、用一個HashMap來存數據(由於它有不重複的特色),
二、key存放的是說這個顏色有多少隻兔子的個數
三、value存放的是說這個個數的兔子個數
四、最後經過一種顏色的兔子個數爲 ⌈value/(key+1)⌉*(key+1)
五、最後所有相加
三、代碼實現
package com.java;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Day04_Solution {
public int numRabbits(int[] answers) {
//map第一個位置和本身顏色相同的兔子的個數,第二個位置是這樣子說的兔子的個數
Map<Integer,Integer> map = new HashMap<>();
int sum=0;
for (int i=0;i<answers.length;i++) {
if(map.containsKey(answers[i])) {
map.put(answers[i],map.get(answers[i])+1);
} else {
map.put(answers[i],1);
}
}
Set<Integer> keys = map.keySet();
for (Integer key:keys) {
Integer value = map.get(key);
System.out.println(key + ":" + value);
sum = sum + (int)Math.ceil((double)value / (key + 1)) * (key + 1);
}
return sum;
}
}