The link to the question:https://leetcode.com/problems/relative-ranks/;
This is my solution:Using a two-dimensional array nums[2][scoreSize]:nums[0][scoreSize] to record score[scoreSzie].nums[1][scoreSize] to record the index of every element in score[scoreSzie].Then QuickSort for nums[2][scoreSize].So the output is:the element in nums[0][scoreSize] arranges from big to small order,and nums[1][scoreSize] records corresponding index of the element in score[scoreSize].At last, using ret[nums[1][i]] to record the rank and return.Here is the code:
void quicksort(int left,int right,int row,int col,int nums[row][col]);
char **findRelativeRanks(int* score, int scoreSize, int* returnSize)
{
char **ret=(char **)malloc(sizeof(char *)*scoreSize);
*returnSize=scoreSize;
int i;
int nums[2][scoreSize]; //to record score[scoreSzie] and index
for(i=0;i<scoreSize;i++)
{
nums[0][i]=score[i];
}
for(i=0;i<scoreSize;i++)
{
nums[1][i]=i;
}
quicksort(0,scoreSize-1,2,scoreSize,nums); //Quicksort for nums[2][scoreSize]
for(i=0;i<scoreSize;i++) //record rank by ret[scoreSize]
{
if(i<3)
{
switch(i)
{
case 0:ret[nums[1][0]]=(char*)malloc(sizeof(char)*15);
strcpy(ret[nums[1][0]],"Gold Medal");
break;
case 1:ret[nums[1][1]]=(char*)malloc(sizeof(char)*15);
strcpy(ret[nums[1][1]],"Sliver Medal");
break;
case 2:ret[nums[1][2]]=(char*)malloc(sizeof(char)*15);
strcpy(ret[nums[1][2]],"Bronze Medal");
break;
default:break;
}
}else
{
ret[nums[1][i]]=(char*)malloc(sizeof(char)*1);
ret[nums[1][i]][0]='1'+i;
}
}
return ret;
}
void quicksort(int left,int right,int row,int col,int nums[row][col])
{
if(left<right)
{
int l=left,r=right;
int pivot=nums[0][left];
int temp=nums[1][left];
while(l<r)
{
while(r>l&&nums[0][r]<=pivot) r--;
if(r>l)
{
nums[1][l]=nums[1][r];
nums[0][l++]=nums[0][r];
}
while(r>l&&nums[0][l]>pivot) l++;
if(r>l)
{
nums[1][r]=nums[1][l];
nums[0][r--]=nums[0][l];
}
}
nums[0][l]=pivot;
nums[1][l]=temp;
quicksort(left,l-1,row,col,nums);
quicksort(l+1,right,row,col,nums);
}else
{
return;
}
}
The error is
=================================================================
==42==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000072 at pc 0x564293732f0b bp 0x7fffde673830 sp 0x7fffde673820
READ of size 1 at 0x602000000072 thread T0
#3 0x7fbdea9b60b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
0x602000000072 is located 0 bytes to the right of 2-byte region [0x602000000070,0x602000000072)
allocated by thread T0 here:
#0 0x7fbdeb5fbbc8 in malloc (/lib/x86_64-linux-gnu/libasan.so.5+0x10dbc8)
#3 0x7fbdea9b60b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
Shadow bytes around the buggy address:
0x0c047fff7fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x0c047fff8000: fa fa 00 07 fa fa 00 07 fa fa 00 07 fa fa[02]fa
0x0c047fff8010: fa fa 02 fa fa fa fd fa fa fa fd fd fa fa fa fa
0x0c047fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
Shadow gap: cc
==42==ABORTING
As a new programmer,i try my best to figure out where the problem is,but i failed.I really need help.Thank you very much.