题目描述:给定一个整形数组,给一个特定的值k。找出数组中相邻的,使得值之和等于给定值的坐标。例如[1,2,3,4,5,6]和给定值10,则返回1和4。
思路:
双指针:设定i=0和j=1,设定初始值sum等于num[i],当sum值小于k时将num[j]加到sum中,j++,同理当sum值大于k时,将num[i]从sum中删除,同时i--。代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MAX_LENGTH 20
typedef struct {
int *nums;
int length;
int max_length;
}Nums,*PNums;
typedef struct {
int start;
int end;
}Index;
Nums input();
Index jisuan(int*,int,int);
int main(){
//输入进行测试的数组
Nums test_nums = input();
//输入要进行求和的数字k
int k = 10;
scanf("%d",&k);
//传入数组数据和k进行计算
Index result=jisuan(test_nums.nums,k,test_nums.length);
if(result.start==-1){
printf("don't exsit!");
} else {
printf("start:%d end:%d:", result.start + 1, result.end + 1);
for(int i=result.start;i<result.end;i++){
printf("%d+",test_nums.nums[i]);
}printf("%d",test_nums.nums[result.end]);
printf("=%d\n",k);
}
}
Index jisuan(int *nums,int k,int length){
int i=0,j=1;
int sum=nums[i];
Index result={-1,-1};
while(j<length&&i<length){//保证两个坐标都不越界
if(sum<k){
sum += nums[j];
if(sum==k){//加完即进行相等判断
result.start=i;
result.end=j;
break;
}
j++;
} else if(sum>k){
sum -= nums[i];
if(sum==k){//减完即进行相等判断
result.start=i;
result.end=j;
break;
}
i++;
}
}
return result;
}
//自定义数据输入,输入的数据用结构体进行保存,用数组对输入的数进行保存,并同时记录了输入的个数
Nums input(){
Nums test_nums;
test_nums.length=0;
test_nums.max_length = MAX_LENGTH;
test_nums.nums = (int*)malloc(test_nums.max_length*sizeof(int));
printf("%s","please input numbers,input -1 to end:\n");
int temp = 0;
while(1){
scanf("%d",&temp);
if(temp==-1){
break;
}
if(test_nums.length==test_nums.max_length){
test_nums.max_length += (int)MAX_LENGTH/2;
test_nums.nums = (int*) realloc(test_nums.nums,test_nums.max_length*sizeof(int));
}
test_nums.nums[test_nums.length++] = temp;
}
return test_nums;
}
如有bug,请各位大佬批评指正~~