leetCode打卡-day9

 

目录

1588. 所有奇数长度子数组的和

进制转换


1588. 所有奇数长度子数组的和

1588. 所有奇数长度子数组的和

1暴力三维枚举

int sumOddLengthSubarrays(int* arr, int arrSize){
    int sum=0;
    for(int i=1;i<=arrSize;i+=2)//长度
    {
        for(int j=0;j<=arrSize-i;j++)//起始
        {
            for(int k=j;k<j+i;k++)//累加
                sum+=arr[k];
        }
    }
    return sum;
}   

 2前缀和二维枚举

int sumOddLengthSubarrays(int* arr, int arrSize){
    int sum=0;
    int *copy=(int*)malloc(sizeof(int)*(arrSize+1));
    copy[0]=0;
    for(int i=1;i<=arrSize;i++)//前缀和
        copy[i]=copy[i-1]+arr[i-1];

    for(int len=1;len<=arrSize;len+=2)
        for(int start=0;start<=arrSize-len;start++)
            sum+=copy[start+len]-copy[start];


    return sum;
}  

 3数学思维,算在奇数长度子数组中出现的频次

int sumOddLengthSubarrays(int* arr, int arrSize){
    int sum=0;
    int right,left,r_odd,r_even,l_odd,l_even;
    for(int i=0;i<arrSize;i++)
    {
        left=i;//a[i]左边元素的个数
        right=arrSize-i-1;//a[i]右边元素的个数
        l_odd=(left+1)/2;//左边取奇数个数的可能
        l_even=left/2+1;//左边取偶数数个数的可能
        r_odd=(right+1)/2;
        r_even=right/2+1;
        sum+=(l_odd*r_odd+l_even*r_even)*arr[i];
    }
    return sum;
}  

进制转换

504. 七进制数

char* convertToBase7(int num) {
    if(num==0)return "0";
    char* co = (char*)malloc(sizeof(char) * 32);
    int cnt = 0,f=1;
    if(num<0){num=-num;co[cnt++]='-';f=0;}
    while (num > 0)
    {
        co[cnt++] = num % 7 + 48;
        num /= 7;
    }
    int l=0,r=cnt-1;
    if(f==0)l=1;
    for (; l < r; l++, r--)//翻转字符串
    {
        char c = co[l];
        co[l] = co[r];
        co[r] = c;
    }
    co[cnt] = '\0';
    return co;
}

405. 数字转换为十六进制数

char* toHex(int num) {
    if (num == 0)return "0";
    char* ans = (char*)malloc(sizeof(char) * 32);
    long long co;
    int cnt = 0;
    long long NUM = num;
    if (num < 0)NUM += pow(2, 32);//负数x的补码=2^n+x
    while (NUM> 0)
    {
        co = NUM % 16;
        if (co > 9)co += 87;
        else co += 48;
        ans[cnt++] =co;
        NUM/= 16;
    }
    for (int l = 0, r = cnt - 1; l < r; l++, r--)
    {
        char t = ans[l];
        ans[l] = ans[r];
        ans[r] = t;
    }
    ans[cnt] = '\0';
    return ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值