每日一刷--LeetCode

2018.8.30    Q26.

①C语言求数组a的长度,常用方法是sizeof(a)/sizeof(a[0])。

但若是通过传递数组名参数到子函数中,就不可以这样获得数组长度。因为 a是函数参数,到了子函数中就是一个指针了,而系统运行时是不知道该指针指向的地址占多大空间的。所以如果子函数内部需要用到数组长度,应该将其作为参数与数组一起传入。https://zhidao.baidu.com/question/263663984320559685.html

②数组为空长度为0的情况需要单独考虑。

2018.8.31    Q189

①数组声明时,可以使用一个已经声明了的变量来定义长度:int tmp[k];

②要考虑操作数的大小超过数组长度的情况。

解法一:

void rotate(int* nums, int numsSize, int k) {
    if(numsSize<1||k<1){
        return;
    }
    int i=0, tmp[k];
    k=k%numsSize;
    for(i=0;i<k;i++){
        tmp[i]=nums[numsSize-k+i];
    }
    for(i=numsSize-k-1;i>=0;i--){
        nums[i+k]=nums[i];
    }
    for(i=0;i<k;i++){
        nums[i]=tmp[i];
    }
}

解法二: 2018.9.1

void rotate(int* nums, int numsSize, int k) {
    if(numsSize<1||k<1){
        return;
    }
    int i=0, j=0, tmp[k];
    k=k%numsSize;
    for(i=0;i<k;i++){
        tmp[i]=nums[numsSize-k+i];
    }
    for(i=0;i<k;i++){
        for(j=numsSize-1-i-k; j>=0;j=j-k){
            nums[j+k]=nums[j];
        }
    }
    for(i=0;i<k;i++){
        nums[i]=tmp[i];
    }
    return;
}

在用解法二时,不知什么时候把 int tmp[k]; 语句放到 k = k%numsSize; 之后了,结果一直报错说 数组的长度绑定了个非整数k。懵逼了好久,后来才反应过来,1对1取余的结果是0 而不是1,所以一当numsSize和k相等时,k就成了0,一声明数组可不就成了非正数的长度。

2018.9.2    Q217

扫描二维码关注公众号,回复: 3077013 查看本文章

解出来并不难,但用时太长(1861ms),寻找一下更快的办法。

不知为何想到了常用的排序算法,能不能先排好序再遍历一遍?查了查,C语言提供了一个快速排序的库函数 qsort() ,采用这种思路解题,果然用时变得很短(32ms)。下面是对 qsort() 的介绍:

①void  qsort() 在stdlib.h 函数库里,采用了快速排序算法的思想,返回值为空。

②函数参数共4个,为( void* base,    int nelem,    int width,      int* (fcom) (const void* , const void*),各参数的含义分别为:

(void * 待排序的数组的首地址,    int 数组长度,        int 单个元素的大小(可用sizeof(a[0])计算),

定义排序顺序的函数名称)

③ 需要另外单独定义一个函数,用于确定是递增排序还是递减排序。若分别命名为compInc(递增)和compDec(递减),则函数应定义为:

int compInc(const void* a, const void* b){
    return *(int*) a - *(int*) b;
}



int compDes(const void* a, const void* b){
    return *(int*) b - *(int*) a;
}

2018.9.3   Q122

第一次看到题目时感觉很复杂,产生了畏难心理,放了好几天才做。“怎么编程才能解出题?人怎么想,就让计算机怎么想,不要怕难”。

理了理思路,写了第一版出来。因为用到了递归,所以在参数传递时用到了数组的传递方法——若函数参数列表为 function(void * a,……),有一个数组nums[] = {1,2,3,4,5,6},那么当想把nums传到函数里时,应该在数组名前加取地址符号:function(&a[0], ……)。

目前题目的测试用例里都有一个很长很复杂的测试样例,递归的思路在解该测试用例时超时了,想想怎么用循环解决。

在将思维转化成代码的过程中,有一些直觉用了的思路后来发现都是合理的,所以要勤加练习,多整理思路,珍惜之前的直觉。

2018.9.3   Q136

线性时间复杂度:O(n logn)算线性。

2018.9.4   Q

2018.9.5   Q350

malloc() 的用法:有个数组int a, 给其分配内存: a = (int *)malloc (数组大小)   ;      malloc()的返回值是void * 类型,要强制类型转换。

编译出错了:Line 17: load of null pointer of type 'int'。         

17行是:if(nums1[i]<nums2[j])

真的不明白错在了哪啊哭,,,,,,

猜你喜欢

转载自blog.csdn.net/m0_37222917/article/details/82227231