力扣1822. 数组元素积的符号

来源:1822. 数组元素积的符号 - 力扣(LeetCode)

题目

已知函数 signFunc(x) 将会根据 x 的正负返回特定值:

  • 如果 x 是正数,返回 1 。
  • 如果 x 是负数,返回 -1 。
  • 如果 x 是等于 0 ,返回 0 。

给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的乘积。

返回 signFunc(product) 。

示例 1:

输入:nums = [-1,-2,-3,-4,3,2,1]
输出:1
解释:数组中所有值的乘积是 144 ,且 signFunc(144) = 1

示例 2:

输入:nums = [1,5,0,2,-3]
输出:0
解释:数组中所有值的乘积是 0 ,且 signFunc(0) = 0

示例 3:

输入:nums = [-1,1,-1,1,-1]
输出:-1
解释:数组中所有值的乘积是 -1 ,且 signFunc(-1) = -1

提示:

  • 1 <= nums.length <= 1000
  • -100 <= nums[i] <= 100

详解 

思路 

这道题存在误导性,容易让人误以为需要先计算整个数组的乘积再进行判断。实际上这种做法完全没有必要。

可以通过计算数组中负数的个数来解决,而不需要直接计算所有元素的乘积。因为乘积的正负取决于负数的个数:

  • 如果负数的个数是偶数,乘积为正数。
  • 如果负数的个数是奇数,乘积为负数。
  • 如果数组中存在一个零,乘积为零。

因此,我们只需要遍历数组,统计负数的个数,并检查是否有零即可

class Solution {
    public int arraySign(int[] nums) {
        int product =1;
        for (int num : nums){
            if (num == 0)return 0;
            if (num < 0 ) {
                product = -product;
            }
        }
        return product;
    }
}
力扣LeetCode)题目中,使用 `qsort` 函数实现排序是一种常见的做法,尤其适用于需要自定义比较逻辑的场景。`qsort` 是 C 标准库 `<stdlib.h>` 中提供的一个通用排序函数,其灵活性体现在可以通过传递一个自定义的比较函数来控制排序行为。 ### 使用 `qsort` 进行排序的基本用法 `qsort` 的函数原型如下: ```c void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); ``` - `base`:指向要排序数组的起始地址。 - `nmemb`:数组元素的数量。 - `size`:每个元素的大小(以字节为单位)。 - `compar`:指向比较函数的指针,用于确定排序顺序。 #### 示例代码 以下是一个使用 `qsort` 对整型数组进行升序排序的示例: ```c #include <stdio.h> #include <stdlib.h> int compare(const void *a, const void *b) { return (*(int *)a - *(int *)b); } int main() { int arr[] = {45, 12, 34, 77, 90, 11, 2, 4, 5, 55}; int n = sizeof(arr) / sizeof(arr[0]); qsort(arr, n, sizeof(int), compare); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ``` ### 力扣题解中的 `qsort` 应用 在一些涉及复杂排序逻辑的 LeetCode 题目中,`qsort` 能够很好地支持自定义排序需求。 #### 按权重排序问题中的应用 在引用[3]中提到的问题“将整数按权重排序”中,使用了 `qsort` 来根据数字的 Collatz 步骤数(即权重)对区间内的整数进行排序。具体而言,通过定义 `weight` 函数计算每个数字的权重,并实现 `compare` 函数来决定排序规则: - 如果两个数字的权重相同,则按照数值本身升序排列。 - 否则,按照权重升序排列。 以下是完整的代码片段: ```c // 计算权重函数 int weight(int x) { int steps = 0; while (x != 1) { if (x % 2 == 0) { x /= 2; } else { x = 3 * x + 1; } steps++; } return steps; } // 比较函数,用于排序 int compare(const void *a, const void *b) { int weightA = weight(*(int *)a); int weightB = weight(*(int *)b); if (weightA == weightB) { return (*(int *)a - *(int *)b); // 如果权重相同,按数字升序 } return weightA - weightB; // 按权重升序 } // 主函数:获取区间 [lo, hi] 内第 k 个数字按权重排序后的结果 int getKth(int lo, int hi, int k) { int n = hi - lo + 1; int numbers[n]; for (int i = 0; i < n; i++) { numbers[i] = lo + i; } qsort(numbers, n, sizeof(int), compare); return numbers[k - 1]; } ``` 该方法展示了如何利用 `qsort` 实现复杂的排序逻辑[^3]。 ### 注意事项 - **自定义比较函数**:确保比较函数返回值的符号与排序顺序一致。例如,若希望升序排列,则当第一个参数小于第二个参数时应返回负值。 - **数据类型一致性**:由于 `qsort` 是通用函数,传入的数组和比较函数必须保证数据类型一致,否则可能导致未定义行为。 - **性能考量**:尽管 `qsort` 的平均时间复杂度为 O(n log n),但在某些极端情况下(如输入已有序),其性能可能下降到 O(n²)。 ### 总结 在 LeetCode 编程环境中,`qsort` 提供了一种灵活且高效的排序手段,特别是在处理需要自定义排序规则的问题时非常有用。合理地设计比较函数可以应对各种排序需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值