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
解出来并不难,但用时太长(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])
真的不明白错在了哪啊哭,,,,,,