目录
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;
}
进制转换
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;
}
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;
}