咳咳咳...
===比數字===
int comp(const void *a , const void *b)
{
return (*(int *)a - *(int*)b);
}
qsort((void *)coins,coinsSize,sizeof(int),comp);
===比字串===
int comp (const void *a , const void *b)
{
return strcmp((char *)a, (char *)b);
}
qsort(s,len,sizeof(char),comp);
int comp(const void *a, const void *b)
{
int *A= *(int **)a;
int *B= *(int **)b;
return A[0]-B[0];
}
qsort((void *)points, pointsSize, sizeof(points[0]), comp);
(另一種?!)
int comp(const void *a, const void *b)
{
int* p1 = *(int **)a;
int* p2 = *(int **)b;
return p1[1]-p2[1];
}
qsort(intervals, intervalsSize, sizeof (int*), comp);
如果數字相減會overflow,就改成比大小後回傳0, 1, -1
int comp(const void *a, const void *b)
{
int *A= *(int**)a;
int *B= *(int**)b;
if (A[1]==B[1])
return 0;
else
return (A[1] > B[1]) ? (1) : (-1);
}
qsort((void *)points, pointsSize,sizeof (int**), comp);
===malloc===
char* str = malloc (sizeof(char)*(maxLen+2));
int* ret = malloc (sizeof(int)*numsSize);
===calloc===
char *ret = calloc(len, sizeof(char));
數字初始化為零
int *count = calloc (len,sizeof(int)*(len));
===memset & memcpy===
memcpy(dest,source,sizeof(int)*numsSize);
memset(stack, 0, sizeof(char) * (maxLen *maxLen));
輸入為 **grid , m x n 大小
int **rotate = calloc (m, sizeof(int *));
for (int i=0;i<m; i++)
rotate[i]= calloc (n, sizeof(int));
memcpy(rotate, grid, sizeof(int*)*m);
此時sizeof(int) 是4 , sizeof (int*) 跟sizeof(int**) 跟sizeof (grid)都是8
但是此方法有可能有copy到garbage的情況?! 建議還是兩個for 下去複製......QQ
(沒時間debug XD 或是歡迎知道原因的人在下面留言(?))
使用memcmp看了一下,使用memcpy確實是兩組一樣的。反而assign的話會變成兩者不同!
(大驚)
再度推測,因為grid 是傳進來的,因此可能?!(好吧真的沒時間了,這問題先停在這Orz)
若是用[] [] 方式則 (用 2x3舉例)
int TEST[2][3]={{4,3,2},{4,3,2}};
int OUT[2][3]={{1,2,3},{1,2,3}};
memcpy(OUT, TEST, sizeof(int)*(2*3));
===quick sort 例子===
void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a=*b;
*b=tmp;
}
void qqsort(int* nums,int low, int right)
{
int l=low, r=right;
int mid = (l+r)/2;
int pivot= nums[mid];
while (l<=r)
{
while (nums[l]< pivot)
l++;
while (nums[r]>pivot)
r--;
if (l<=r)
{
swap(&nums[l],&nums[r]);
l++;
r--;
}
}
if (low<r)
qqsort(nums,low,r);
if (l<right)
qqsort(nums,l,right);
}
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
if (n==0 && m==1)
return;
if (n==1 && m==0)
{
nums1[0]=nums2[0];
return;
}
for (int i =m;i< m+n;i++)
nums1[i]=nums2[i-m];
qqsort(nums1,0,nums1Size-1);
}
=====binary search=====
int search(int* nums, int numsSize, int target){
int left=0,right=numsSize-1;
int mid=(left+right)/2;
while (left<=right)
{
mid=(left+right)/2;
if (nums[mid] < target)
left=mid+1;
else if (nums[mid]> target)
right=mid -1;
else
return mid;
}
return -1;
}
=====新版 malloc & return column=====
int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
int count= factorial(numsSize);
*returnSize = count;
int **ret = malloc(sizeof(int*)* (count));
*returnColumnSizes= malloc (sizeof(int)*(count));
for (int i=0;i<(count);i++)
{
ret[i]=malloc(sizeof(int)*numsSize);
(*returnColumnSizes)[i]= numsSize;
}
count=0;
myPermute(nums, numsSize,&count,0,numsSize-1,ret);
return ret;
}
要用到的時候再calloc / malloc 就好了,不用一定要先用for 回圈跑起來初始化
例子:
int checkSum(struct TreeNode* root, int **ret, int **returnColumnSizes, int *data)
{
ret[o_idx]=calloc(idx+1, sizeof(int)); //宣告 ret[i][j]的 j的部分
o_idx = checkSum(root->left, target, idx+1,o_idx, ret, returnColumnSizes,data);
}
int** pathSum(struct TreeNode* root, int targetSum, int* returnSize, int** returnColumnSizes) {
int** ret = calloc (5000, sizeof(int*)); //宣告全部的size
*returnSize = checkSum(root, returnColumnSizes, data);
return ret;
}
=====C的hash table 怎麼用=====
(好像要include東西,但看起來leetcode裡面有包 XD)
struct hash_struct{
int id;
int value;
UT_hash_handle hh;
};
struct hash_struct *hash=NULL; //整個hash table
struct hash_struct *tmp=NULL; //要新建的時候拿來當做tmp pointer
//(建table)
HASH_FIND_INT( hash, &nums[i], tmp ); //先看這個element 在不在裡面,用id找
if (tmp == NULL)
{
tmp=malloc (sizeof (struct hash_struct)*1);
tmp->id= nums[i];
tmp->value=i;
HASH_ADD_INT(hash, id ,tmp); //不在的話加進去。第二個參數"id"是欄位的名字"id",就是這樣寫XD
}
=====宣告一個function pointer=====
回傳值是int , 參數是一個int
int (*a)(int);
沒有留言:
張貼留言