寻找数组中相邻的数据,使它们之和等于给定的值

题目描述:给定一个整形数组,给一个特定的值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,请各位大佬批评指正~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值