二十一、数组中两元素最大乘积
给你一个整数数组
nums
,请你选择数组的两个不同下标i
和j
, 使(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
包含从1
到n
的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。给定一个数组
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;
}