小U的数字插入问题Python笔记 一、问题描述 假设我们有一个数字序列(可能是有序的,也可能是无序的),我们要按照特定的规则向这个序列中插入一个数字。这个规则可以有很多种,例如: 1.如果序列是有序的(升序或降序),要将数字插入到合适的位置,使得插入后序列仍然保持有序。 2.如果序列是无序的,可能需要按照数字的某种属性(例如奇偶性、是否为质数等)来确定插入位置。 二、有序序列的数字插入 (一)升序序列插入 1.思路 1.可以使用线性搜索或者二分搜索来找到插入位置。线性搜索就是从序列的开头开始,依次比较数字大小,直到找到合适的插入点。二分搜索则是利用序列的有序性,每次将搜索区间缩小一半,更快地找到插入位置。 2.示例代码(线性搜索) def insert_into_ascending_sequence(sequence, num): for i in range(len(sequence)): if num <= sequence[i]: sequence.insert(i, num) return sequence sequence.append(num) return sequence
1.示例代码(二分搜索) def insert_into_ascending_sequence_binary(sequence, num): low = 0 high = len(sequence) - 1 while low <= high: mid = (low + high) // 2 if sequence[mid]==num: sequence.insert(mid, num) return sequence elif sequence[mid]<num: low = mid + 1 else: high = mid - 1 sequence.insert(low, num) return sequence
(二)降序序列插入 1.思路 1.与升序序列类似,但是比较的逻辑相反。在降序序列中,当要插入的数字大于当前比较的数字时,就找到了插入位置。 2.示例代码(线性搜索) def insert_into_descending_sequence(sequence, num): for i in range(len(sequence)): if num >= sequence[i]: sequence.insert(i, num) return sequence sequence.append(num) return sequence
三、无序序列的数字插入 (一)按照奇偶性插入 1.思路 1.如果要按照奇偶性插入数字,我们可以先统计序列中奇数和偶数的个数,然后根据要插入数字的奇偶性来确定插入位置。 2.示例代码 def insert_by_parity(sequence, num): odd_count = sum(1 for num in sequence if num % 2!= 0) if num % 2!= 0: if odd_count == 0: sequence.append(num) else: sequence.insert(odd_count, num) else: if odd_count == len(sequence): sequence.append(num) else: sequence.insert(odd_count, num) return sequence
(二)按照是否为质数插入 1.思路 1.首先需要编写一个函数来判断一个数字是否为质数。然后统计序列中质数的个数,根据要插入数字是否为质数来确定插入位置。 2.判断质数的函数示例 def is_prime(n): if n <= 1: return False if n <= 3: return True if n % 2 == 0 or n % 3 == 0: return False i = 5 while i * i <= n: if n % i == 0 or n % (i + 2)==0: return False i += 6 return True
1.按照是否为质数插入的示例代码 def insert_by_prime(sequence, num): prime_count = sum(1 for num in sequence if is_prime(num)) if is_prime(num): if prime_count == 0: sequence.append(num) else: sequence.insert(prime_count, num) else: if prime_count == len(sequence): sequence.append(num) else: sequence.insert(prime_count, num) return sequence
四、总结 1.在处理小U的数字插入问题时,需要根据序列的特性(有序或无序)以及插入规则(如按照大小、奇偶性、质数等)来选择合适的方法。 2.有序序列插入时,二分搜索通常比线性搜索更高效,尤其是对于较长的序列。 3.对于无序序列插入,需要先明确插入的依据(如奇偶性、质数等属性),然后根据统计结果确定插入位置。 小U的数字插入问题Python实现 一、整体思路 这个问题主要涉及到根据不同的序列状态(有序或无序)和不同的插入规则(如保持有序、按奇偶性、按质数属性等),在给定的数字序列中插入一个数字。 二、有序序列插入 (一)升序序列插入 - 线性搜索 1.详细解释 1.对于升序序列的线性搜索插入方法,我们遍历给定的序列 sequence。 2.对于序列中的每个元素 sequence[i],我们将待插入数字 num 与之比较。 3.当找到第一个大于或等于 num 的元素时,就在该位置插入 num。如果遍历完整个序列都没有找到这样的元素,说明 num 是最大的,直接将其追加到序列末尾。 2.代码示例 def insert_into_ascending_sequence(sequence, num): for i in range(len(sequence)): if num <= sequence[i]: sequence.insert(i, num) return sequence sequence.append(num) return sequence
(二)升序序列插入 - 二分搜索 1.详细解释 1.二分搜索利用了升序序列的特性。 2.我们首先定义搜索区间的下限 low = 0 和上限 high = len(sequence) - 1。 3.在每次循环中,计算中间位置 mid=(low + high) // 2。 4.如果中间元素 sequence[mid] 等于待插入数字 num,则直接在该位置插入 num。 5.如果 sequence[mid]<num,说明 num 应该在 mid 的右侧,所以更新下限 low = mid + 1。 6.如果 sequence[mid]>num,说明 num 应该在 mid 的左侧,所以更新上限 high = mid - 1。 7.当 low>high 时,说明找到了插入位置,就在 low 位置插入 num。 2.代码示例 def insert_into_ascending_sequence_binary(sequence, num): low = 0 high = len(sequence) - 1 while low <= high: mid = (low + high) // 2 if sequence[mid]==num: sequence.insert(mid, num) return sequence elif sequence[mid]<num: low = mid + 1 else: high = mid - 1 sequence.insert(low, num) return sequence
(三)降序序列插入 - 线性搜索 1.详细解释 1.与升序序列的线性搜索类似,但是比较逻辑相反。 2.我们遍历序列,当找到第一个小于或等于 num 的元素时,就在该位置插入 num。如果遍历完整个序列都没有找到这样的元素,说明 num 是最小的,直接将其追加到序列末尾。 2.代码示例 def insert_into_descending_sequence(sequence, num): for i in range(len(sequence)): if num >= sequence[i]: sequence.insert(i, num) return sequence sequence.append(num) return sequence
三、无序序列插入 (一)按照奇偶性插入 1.详细解释 1.首先,我们使用生成器表达式和 sum 函数统计序列中奇数的个数 odd_count。 2.如果待插入数字 num 是奇数,当奇数个数为0时,将 num 追加到序列末尾;否则,将 num 插入到第 odd_count 个位置(即奇数的数量对应的位置)。 3.如果 num 是偶数,当奇数个数等于序列长度时,说明序列中全是奇数,将 num 追加到序列末尾;否则,将 num 插入到第 odd_count 个位置(即奇数的后面,因为奇数后面就是偶数的插入位置)。 2.代码示例 def insert_by_parity(sequence, num): odd_count = sum(1 for num in sequence if num % 2!= 0) if num % 2!= 0: if odd_count == 0: sequence.append(num) else: sequence.insert(odd_count, num) else: if odd_count == len(sequence): sequence.append(num) else: sequence.insert(odd_count, num) return sequence
(二)按照是否为质数插入 1.详细解释 1.首先定义了一个函数 is_prime 来判断一个数字是否为质数。 2.然后使用生成器表达式和 sum 函数统计序列中质数的个数 prime_count。 3.如果待插入数字 num 是质数,当质数个数为0时,将 num 追加到序列末尾;否则,将 num 插入到第 prime_count 个位置。 4.如果 num 不是质数,当质数个数等于序列长度时,将 num 追加到序列末尾;否则,将 num 插入到第 prime_count 个位置(即质数的后面,因为质数后面就是非质数的插入位置)。 2.代码示例 def is_prime(n): if n <= 1: return False if n <= 3: return True if n % 2 == 0 or n % 3 == 0: return False i = 5 while i * i <= n: if n % i == 0 or n % (i + 2)==0: return False i += 6 return True
def insert_by_prime(sequence, num): prime_count = sum(1 for num in sequence if is_prime(num)) if is_prime(num): if prime_count == 0: sequence.append(num) else: sequence.insert(prime_count, num) else: if prime_count == len(sequence): sequence.append(num) else: sequence.insert(prime_count, num) return sequence
四、测试示例
测试升序序列插入(线性搜索)
ascending_sequence = [1, 3, 5, 7, 9] num_to_insert_ascending = 4 new_ascending_sequence = insert_into_ascending_sequence(ascending_sequence, num_to_insert_ascending) print("升序序列线性搜索插入结果:", new_ascending_sequence)
测试升序序列插入(二分搜索)
ascending_sequence_binary = [1, 3, 5, 7, 9] num_to_insert_ascending_binary = 4 new_ascending_sequence_binary = insert_into_ascending_sequence_binary(ascending_sequence_binary, num_to_insert_ascending_binary) print("升序序列二分搜索插入结果:", new_ascending_sequence_binary)
测试降序序列插入(线性搜索)
descending_sequence = [9, 7, 5, 3, 1] num_to_insert_descending = 4 new_descending_sequence = insert_into_descending_sequence(descending_sequence, num_to_insert_descending) print("降序序列线性搜索插入结果:", new_descending_sequence)
测试按奇偶性插入
sequence_parity = [1, 3, 5, 7, 8] num_to_insert_parity = 2 new_sequence_parity = insert_by_parity(sequence_parity, num_to_insert_parity) print("按奇偶性插入结果:", new_sequence_parity)
测试按质数插入
sequence_prime = [4, 6, 8, 9] num_to_insert_prime = 7 new_sequence_prime = insert_by_prime(sequence_prime, num_to_insert_prime) print("按质数插入结果:", new_sequence_prime)