刷题 21-25

二十一、数组中两元素最大乘积

给你一个整数数组 nums,请你选择数组的两个不同下标 ij 使 (nums[i]-1)*(nums[j]-1) 取得最大值。

请你计算并返回该式的最大值。

示例 1:

复制代码
输入:nums = [3,4,5,2]
输出:12 
解释:如果选择下标 i=1 和 j=2(下标从 0 开始),则可以获得最大值,(nums[1]-1)*(nums[2]-1) = (4-1)*(5-1) = 3*4 = 12 。 

示例 2:

复制代码
输入:nums = [1,5,4,5]
输出:16
解释:选择下标 i=1 和 j=3(下标从 0 开始),则可以获得最大值 (5-1)*(5-1) = 16 。

示例 3:

复制代码
输入:nums = [3,7]
输出:12
cpp 复制代码
int cmp(const void *a,const void *b)
{
	return *(int *)a-*(int *)b;
}

int maxProduct(int* nums, int numsSize){
qsort(nums,numsSize,sizeof(int),cmp);
return (nums[numsSize-1]-1)*(nums[numsSize-2]-1);
}
cpp 复制代码
int maxProduct(int* nums, int numsSize) {
    int a = nums[0], b = nums[1];  // 使用数组的第一个和第二个元素初始化变量a和b
    if (a < b) {
        int c = a;  // 临时变量,用于存储a的值
        a = b;      // 将b的值赋给a
        b = c;      // 将c(初始的a)的值赋给b
    }
    for (int i = 2; i < numsSize; i++) {
        if (nums[i] > a) {
            b = a;          // 更新第二大的值(b)为之前的最大值(a)
            a = nums[i];    // 更新最大值(a)为当前元素
        } else if (nums[i] > b) {
            b = nums[i];    // 更新第二大的值(b)为当前元素
        }
    }
    return (a - 1) * (b - 1);  // 返回(a - 1)和(b - 1)的乘积
}

二十二、

给你一个整数数组 nums ,其中总是存在 唯一的 一个最大整数 。

请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1

示例 1:

复制代码
输入:nums = [3,6,1,0]
输出:1
解释:6 是最大的整数,对于数组中的其他整数,6 至少是数组中其他元素的两倍。6 的下标是 1 ,所以返回 1 。

示例 2:

复制代码
输入:nums = [1,2,3,4]
输出:-1
解释:4 没有超过 3 的两倍大,所以返回 -1 。

示例 3:

复制代码
输入:nums = [1]
输出:0
解释:因为不存在其他数字,所以认为现有数字 1 至少是其他数字的两倍。
cpp 复制代码
int m1 = -1, m2 = -1;  // 初始化最大值m1和次大值m2为-1
int index = -1;        // 初始化索引为-1
for (int i = 0; i < numsSize; i++) {
    if (nums[i] > m1) {
        m2 = m1;          // 更新次大值m2为之前的最大值m1
        m1 = nums[i];     // 更新最大值m1为当前元素
        index = i;        // 更新索引为当前元素的索引
    }
    else if (nums[i] > m2) {
        m2 = nums[i];     // 更新次大值m2为当前元素
    }
}
return m1 >= m2 * 2 ? index : -1;  // 如果最大值m1大于等于次大值m2的两倍,则返回最大值的索引,否则返回-1

二十三、错误的集合

集合 s 包含从 1n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复

给定一个数组 nums 代表了集合 S 发生错误后的结果。

请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

示例 1:

复制代码
输入:nums = [1,2,2,4]
输出:[2,3]

示例 2:

复制代码
输入:nums = [1,1]
输出:[1,2]
cpp 复制代码
int* a = (int*)malloc(sizeof(int) * numsSize);  // 动态分配大小为numsSize的整型数组a
for (int i = 0; i < numsSize; i++) {
    a[i] = 0;  // 将数组a的所有元素初始化为0
}
for (int i = 0; i < numsSize; i++) {
    a[nums[i] - 1]++;  // 统计每个数出现的频次,并将频次记录在数组a中
}
int* res = (int*)malloc(sizeof(int) * 2);  // 动态分配大小为2的整型数组res
for (int i = 0; i < numsSize; i++) {
    if (a[i] == 2) {
        res[0] = i + 1;  // 找到频次为2的数,存储在res的第一个位置
    }
    if (a[i] == 0) {
        res[1] = i + 1;  // 找到频次为0的数,存储在res的第二个位置
    }
}
*returnSize = 2;  // 设置返回结果数组的大小为2
return res;  // 返回结果数组的地址

二十四、将给定的字符串转化为整形

cpp 复制代码
//将给定的字符串转化为整形
int exchange(char* ss)
{
	int result = 0;
	while (*ss != '\0')
	{
		if (*ss >= '0' && *ss <= '9')
		{
			result = result * 10 + (*ss-'0');
			ss++;
		}
		else
		{
			break;
		}
		
	}
	return result;
}

int main() {
	const char* str = "12345";
	int num=exchange(str);
	printf("String: %s\n", str);
	printf("Integer: %d\n", num);

	return 0;
}

二十五、找出一个数字中有多少个1

cpp 复制代码
int countSetBits(int num) {
    int count = 0;
    while (num != 0) {
        if (num & 1) {
            count++;
        }
        num = num >> 1;
    }
    return count;
}
相关推荐
好奇龙猫7 分钟前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
sp_fyf_202443 分钟前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
ChoSeitaku1 小时前
链表交集相关算法题|AB链表公共元素生成链表C|AB链表交集存放于A|连续子序列|相交链表求交点位置(C)
数据结构·考研·链表
偷心编程1 小时前
双向链表专题
数据结构
香菜大丸1 小时前
链表的归并排序
数据结构·算法·链表
jrrz08281 小时前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
oliveira-time1 小时前
golang学习2
算法
@小博的博客2 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
南宫生2 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
懒惰才能让科技进步3 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝