问题描述:给你一组代表运动员成绩的整数,按照他们的成绩返回String数组,第一名对应Gold Medal,第二名对应Silver Medal,第三名对应Bronze Medal。其他则是排名。
思路:构建数组记录成绩。然后倒序遍历成绩从而得出名次。再遍历原成绩,根据成绩记录数组得出对应的名次。
原答案:
public String[] findRelativeRanks(int[] nums) {
String [] res=new String [nums.length];
int max=0;
for(int num:nums){
max=Math.max(max,num);
}
int [] record=new int[max+1];
for(int num:nums){
record[num]++;
}
int pos=1;
for(int i=max;i>=0;i--){
if(record[i]>0)
record[i]=pos++;
}
for(int i=0;i<nums.length;i++){
int num=record[nums[i]];
if(num==1)
res[i]="Gold Medal";
else if(num==2)
res[i]="Silver Medal";
else if(num==3)
res[i]="Bronze Medal";
else
res[i]=String.valueOf(num);
}
return res;
}
最佳答案:
public String[] findRelativeRanks(int[] nums) {
String[] result = new String[nums.length];
int max = 0;
for (int i : nums) {
if (i > max) max = i;
}
int[] hash = new int[max + 1];
for (int i = 0; i < nums.length; i++) {
hash[nums[i]] = i + 1; //map value to index + 1
}
int place = 1;
for (int i = hash.length - 1; i >= 0; i--) {
if (hash[i] != 0) { //need index + 1
if (place == 1) {
result[hash[i] - 1] = "Gold Medal";
} else if (place == 2) {
result[hash[i] - 1] = "Silver Medal";
} else if (place == 3) {
result[hash[i] - 1] = "Bronze Medal";
} else {
result[hash[i] - 1] = String.valueOf(place);
}
place++;
}
}
return result;
}
并不需要再遍历一次得出名次。名次与成绩的对应关系已经建立了。