给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 ..n 中没有出现在序列中的那个数。给定一个整数,写一个函数来判断它是否是 3 的幂次方。

这篇博客主要介绍了两个问题:如何在包含0到n的序列中找到缺失的数,以及如何判断一个整数是否是3的幂次方。通过示例展示了算法的应用,如寻找序列[3, 0, 1]中缺失的2和判断27、0、9和45是否为3的幂次方。" 79462507,7398542,寻找连续正整数序列,"['数学', '算法', '编程', '数学建模']

给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 ..n 中没有出现在序列中的那个数。

示例 1:

输入 : [3, 0, 1]
输出 : 2
     示例 2 :

 输入 : [9, 6, 4, 2, 3, 5, 7, 0, 1]
  输出 : 8

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>

//因为是0-n中少一个数,那么直接用一个自加的数异或该数组的数  最后的结果是几,就返回几
int missingNumber(int* nums, int numsSize) {
	int a = 1;
	int i = 0;
	int num = 0;
	for (; i<numsSize; i++, a++)
	{
		num ^= (a^nums[i]);   
	}
	return num;

}

int main()
{
	int nums[] = { 9, 6, 4, 2, 3, 5, 7, 0, 1 };
	int len = sizeof(nums) / sizeof(int);
	int a = missingNumber(nums, len);
	printf("%d\n", a);
	system("pause");
	return 0;
}

 

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例 :

输入 : [0, 1, 0, 3, 12]
输出 : [1, 3, 12, 0, 0]

 

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <
这是一个经典的动态规划问题,通常称为 **最大子数组和问题**(Maximum Subarray Problem)。最著名的解法是 **Kadane算法**,时间复杂度为 $O(N)$,空间复杂度为 $O(1)$。 --- ### ✅ 问题描述: 给定一个长度为 $N $ 的整数序列(可能包含负数),找出一段**连续子数组**,使其元素之和最大。 例如: ```python nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4] ``` 最大连续子数组是 `[4, -1, 2, 1]`,其和为 `6`。 --- ### ✅ 解决方案:Kadane 算法 ```python def max_subarray_sum(nums): if not nums: return 0 # 或者返回 float(&#39;-inf&#39;) 表示无有效结果 max_sum = nums[0] # 全局最大和 current_sum = nums[0] # 当前子数组的和 for i in range(1, len(nums)): # 决定是“继续之前的子数组”还是“重新开始” current_sum = max(nums[i], current_sum + nums[i]) # 更新全局最大值 max_sum = max(max_sum, current_sum) return max_sum # 示例使用 nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4] result = max_subarray_sum(nums) print("最大连续子数组和为:", result) ``` --- ### 🔍 代码解释: - `current_sum = max(nums[i], current_sum + nums[i])` 这是核心逻辑:在每一步判断是否值得把当前数字加入前面的子数组。如果前面的累计和拖累了当前数(即加上后变小了),不如从当前数重新开始。 - `max_sum = max(max_sum, current_sum)` 记录过程中出现过的最大和。 - 时间复杂度:$O(N)$,只遍历一次。 - 空间复杂度:$O(1)$,仅用两个变量。 --- ### ✅ 扩展:同时返回最大子数组的起始和结束位置 ```python def max_subarray_with_indices(nums): if not nums: return 0, -1, -1 max_sum = nums[0] current_sum = nums[0] start = 0 end = 0 temp_start = 0 # 暂存可能的新起点 for i in range(1, len(nums)): if current_sum < 0: current_sum = nums[i] temp_start = i else: current_sum += nums[i] if current_sum > max_sum: max_sum = current_sum start = temp_start end = i return max_sum, start, end # 示例 nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4] max_sum, start, end = max_subarray_with_indices(nums) print(f"最大和: {max_sum}, 起始索引: {start}, 结束索引: {end}") print(f"对应子数组: {nums[start:end+1]}") ``` > 输出: ``` 最大和: 6, 起始索引: 3, 结束索引: 6 对应子数组: [4, -1, 2, 1] ``` --- ### 💡 提示: - 如果数组全为负数,该算法仍能正确工作,返回最大的那个负数(而不是0)。 - 若题目要求至少选一个元素,则不能初始化为0。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值