题目一
思路解析
当看到要处理数组里面的两个对象时,很容易想到双重循环,所以这里直接双循环来让数组两个不同的key相加凑target,就这么简单吧,当找到一个的时候就可以把他们存进一个数组里面return出来。
关键点
1.当我写函数的时候很容易忘记什么时候要用到指针变量,于是经过查询得到以下结果:
2.遇到的坑就是我想返回 return [i,j],但是很可惜不可以回复两个值,所以最后存到了数组里面然后输出。顺带一提这个数组需要被MALLOC。因为你这个函数本来就是int* 类型的,需要通过malloc调用内存然后才能安全通过函数返回。
我的代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
int i, j;
*returnSize=2;
int *ans=(int*)malloc(2*sizeof(int));
for (i = 0; i < numsSize - 1; i++) {
for (j = i + 1; j < numsSize; j++) {
if (nums[i]+nums[j]==target){
ans[0]=i;
ans[1]=j;
return ans;
}
}
}
*returnSize=0;
free(ans);
return NULL;
}
题目二
思路解析
这是经典的高精度加法题,思想就是把两个或者若干个加数先用字符串读入,然后再转化成数组(这个过程要倒序录入,目的是让a[1] 是个位。然后逐位相加。
关键点
1.倒序的时候容易忘记lenA-i-1;
2.lenC=(lenA>lenB ? lenA : lenB)
我的代码
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
char s1[505],s2[505];
int a[505]={0},b[505]={0},c[505]={0};
scanf("%s",s1);
scanf("%s",s2);
int lenA=strlen(s1);
int lenB=strlen(s2);
int lenC=(lenA>lenB ? lenA : lenB)+1; //因为a+b的结果c位数一定是这两个数字最大位数+1
int i;
for(i=0;i<lenA;i++){
a[i]=s1[lenA-i-1]-'0';//这一步换成数字,并且把数字倒转过来让a[1]表示个位
}
for(i=0;i<lenB;i++){
b[i]=s2[lenB-i-1]-'0';
}
int j;
for(j=0;j<lenC;j++){
c[j]+=a[j]+b[j];
c[j+1]=c[j]/10;
c[j]%=10; //这一块是高精度加法的核心思想!!!
}
if(c[lenC-1]==0 && lenC>0) lenC--;
for(i=lenC-1;i>=0;i--){
printf("%d",c[i]);
} //最后不忘记倒过来输出,毕竟c[1]是个位
return 0;
}