Leetcode 506. Relative Ranks
来源:互联网 发布:淘宝以下影片允许出售 编辑:程序博客网 时间:2024/05/15 11:55
先上题目:
两个思路:
1. 暴力法。对输入的数组nums[]中的每一个元素都计算它在数组中的大小顺序rank,然后根据rank来计算输出,用switch case语句直接搞定。nums[]有n个元素,每个元素都需要与数组中的其他元素比较一次,时间复杂度是O(n^2) 测试通过时间116ms 代码见下:
int getDigit(int n);void itoa(int val, char* s, int digit);/** * Return an array of size *returnSize. * Note: The returned array must be malloced, assume caller calls free(). */char** findRelativeRanks(int* nums, int numsSize, int* returnSize) { char** res; int i, j; int rank, digit; *returnSize = numsSize; res = (char**)malloc(sizeof(char*)*numsSize); for(i = 0; i < numsSize; i++) { rank = 1; for(j = 0; j < numsSize; j++) { if(i == j) { continue; } else { if(nums[i] < nums[j]) { rank++; } } } switch(rank) { case 1: res[i] = (char*)malloc(sizeof(char)*(strlen("Gold Medal")+1)); strcpy(res[i], "Gold Medal"); break; case 2: res[i] = (char*)malloc(sizeof(char)*(strlen("Silver Medal")+1)); strcpy(res[i], "Silver Medal"); break; case 3: res[i] = (char*)malloc(sizeof(char)*(strlen("Bronze Medal")+1)); strcpy(res[i], "Bronze Medal"); break; default: digit = getDigit(rank); res[i] = (char*)malloc(sizeof(char)*(digit+1)); res[i][digit] = '\0'; itoa(rank, res[i], digit); break; } } return res;}int getDigit(int n) { int d = 0; while(n) { n/=10; d++; } return d;}void itoa(int val, char* s, int digit) { int i, r; for(i = 0; i < digit; i++) { r = val%10; s[digit-1-i] = r+'0'; val/=10; }}
2. 额外利用一个数组scores[],记录下nums[]中出现的所有分数及其对应的位置,即scores[]的key是nums[i],value是对应的下标i。这种方法需要先找出nums[]中的最大值以确定scores[]的大小,赋值好scores[]之后,逆序判断各个元素的rank 找出最大值和赋值scores[]数组耗时O(n),测试通过时间6ms 代码见下:
int getDigit(int n);void itoa(int val, char* s, int digit);char* getString(int n);/** * Return an array of size *returnSize. * Note: The returned array must be malloced, assume caller calls free(). */char** findRelativeRanks(int* nums, int numsSize, int* returnSize) { char** res; int i, max; int rank; int* scores; *returnSize = numsSize; res = (char**)malloc(sizeof(char*)*numsSize); // find max nums[] max = nums[0]; for(i = 1; i < numsSize; i++) { if(max < nums[i]) { max = nums[i]; } } // construct scores[] scores = (int*)malloc(sizeof(int)*(max+1)); memset(scores, -1, sizeof(int)*(max+1)); for(i = 0; i < numsSize; i++) { scores[nums[i]] = i; } // calculate rank rank = 1; for(i = max; i >= 0; i--) { if(scores[i] != -1) { res[scores[i]] = getString(rank); rank++; } } free(scores); return res;}char* getString(int n) { char* s; int d; switch(n) { case 1: s = (char*)malloc(sizeof(char)*(strlen("Gold Medal")+1)); strcpy(s, "Gold Medal"); break; case 2: s = (char*)malloc(sizeof(char)*(strlen("Silver Medal")+1)); strcpy(s, "Silver Medal"); break; case 3: s = (char*)malloc(sizeof(char)*(strlen("Bronze Medal")+1)); strcpy(s, "Bronze Medal"); break; default: d = getDigit(n); s = (char*)malloc(sizeof(char)*(d+1)); s[d] = '\0'; itoa(n, s, d); break; } return s;}int getDigit(int n) { int d = 0; while(n) { n/=10; d++; } return d;}void itoa(int val, char* s, int digit) { int i, r; for(i = 0; i < digit; i++) { r = val%10; s[digit-1-i] = r+'0'; val/=10; }}
阅读全文
0 0
- LeetCode 506. Relative Ranks
- [Leetcode] 506. Relative Ranks
- LeetCode-506. Relative Ranks
- leetcode 506. Relative Ranks
- LeetCode 506. Relative Ranks
- 【Leetcode】506. Relative Ranks
- LeetCode | 506. Relative Ranks
- [LeetCode]506. Relative Ranks
- leetcode 506. Relative Ranks
- LeetCode 506. Relative Ranks
- [leetcode]: 506. Relative Ranks
- leetcode 506. Relative Ranks
- [leetcode]506. Relative Ranks
- LeetCode 506. Relative Ranks
- Leetcode 506. Relative Ranks
- 【LeetCode】506. Relative Ranks
- leetcode 506. Relative Ranks
- leetcode 506. Relative Ranks python
- maven学习笔记(三) maven的坐标
- 【HDU 1114】Piggy-Bank(DP-完全背包)
- jquery面试题(转载)
- 创建WebService服务器以及客户端调用
- COM浅析
- Leetcode 506. Relative Ranks
- SQL AVG 函数
- AndroidStudio基础教程(三)
- mysql主从备份
- 修改php.ini配置文件无效的解决办法
- mysql递归cte(公用表表达式)分层数据(邻接列表模型)
- 数组
- emq开发过程中用到的linux命令
- 从笑话看软测