搜索
首页后端开发C++检查给定的数组是否可以通过将元素减半来构成1到N的排列

检查给定的数组是否可以通过将元素减半来构成1到N的排列

Sep 10, 2023 pm 12:05 PM
数组检查 排列分割 减半

检查给定的数组是否可以通过将元素减半来构成1到N的排列

我们的目的是确定对数组中包含的每个项目执行多次除法是否会创建一个从 1 到 N 的没有任何重复项的整数列表。这项努力的成功将意味着我们的调查目标圆满实现。本质上,确定将给定数组中提供的所有元素切割两个是否会产生完全由 1 到 N 之间的非重复值组成的排列,这是我们工作的主要焦点。确认后,评估我们的论文将成为下一个合乎逻辑的步骤。

语法

在深入研究我们提出的解决方案之前,粗略地了解即将实现的方法的语法非常重要。

bool canBePermutation(vector<int>& arr)
{
   // Implementation goes here
}
</int>

算法

为了解决这个问题,让我们继续使用下面概述的算法来逐步进行 -

  • 要密切关注数组中观察到的组件,请从启动集合或哈希集开始。然后,迭代该数组中存在的每个元素。

  • 为了获得 1 到 N 之间的整数,需要将每个元素除以 2 多次。

  • 检查结果值是否已存在于集合中。如果是,则返回 false,因为排列中不能有重复项。

  • 为了使数组成为有效排列,每个元素都必须满足上述条件。假设完全满足此标准,通过提供 true 返回值来确认其资格可以被视为适当的行动方案。

方法

为了有效解决这个问题。探索不同的策略可能会有所帮助。我将提出两种可能的方法 -

方法 1:基于集合的方法

创建高效的方法需要使用细致的技术,例如使用创建的集合实施跟踪系统,以记录整个过程中遇到的组件。它涉及通过除法过程迭代评估每个组件,确保其结果值落在 1 到 N 个范围值之间,然后在附加新观察到的项目之前检查我们的跟踪集进行验证,然后如果有任何异常则返回 false,否则一旦所有值都返回 true通过星座要求的评估检查。

示例

#include <iostream>
#include <vector>
#include <unordered_set>

bool canBePermutation(std::vector<int>& arr) {
   std::unordered_set<int> seen;
   
   for (int num : arr) {
      while (num > 0 && num != 1) {
         if (seen.find(num) != seen.end())
            return false;
         
         seen.insert(num);
         num /= 2;
      }
      
      if (num == 0)
         return false;
   }
   
   return true;
}

int main() {
   std::vector<int> arr = {4, 2, 1, 3};
   
   if (canBePermutation(arr)) {
      std::cout << "The given array can be transformed into a permutation.";
   } else {
      std::cout << "The given array cannot be transformed into a permutation.";
   }
   
   return 0;
}

输出

The given array cannot be transformed into a permutation.

说明

方法 1 的初始步骤涉及设置一个无序集来跟踪数组中存在的元素。然后,这种编码方法会继续迭代同一数组中的每个元素,每次除以 2,将它们重复减少为 1 到 N 之间的整数。在这些迭代过程中,会检查同一集合中是否已经创建了看似已创建的项目;从而试图避免仅仅由于重复而导致的重复排列。在检测到这些重复排列产生的重复项时,将返回 false,就像在没有重复完成的情况下检查所有内容时一样 - 传递为 true - 有效地指示给定集合是否可以移动到其各自的排列中,同时最小化其组件通过减半。

方法2:排序方法

升序排序有助于检测每个数组项是否可以将其自身呈现为排序列表中的匹配值。如果这些项目都不满足这个标准,我们的输出将产生 false;但是,如果所有项目都通过此测试,它将返回 true。

示例

#include <iostream>
#include <vector>
#include <algorithm>

bool canBePermutation(std::vector<int>& arr) {
   std::sort(arr.begin(), arr.end());

   for (int i = 0; i < arr.size(); i++) {
      int expected = i + 1;
      while (arr[i] > 0 && arr[i] != expected)
         arr[i] /= 2;

      if (arr[i] != expected)
         return false;
   }
   
   return true;
}

int main() {
   std::vector<int> arr = {4, 2, 1, 3};
   
   if (canBePermutation(arr)) {
      std::cout << "The given array can be transformed into a permutation.";
   } else {
      std::cout << "The given array cannot be transformed into a permutation.";
   }
   
   return 0;
}

输出

The given array can be transformed into a permutation.

说明

根据方法 2(排序方法),我们首先按升序排列原始输入数组,然后再进一步进行代码例程检查。该代码随后对上述数组的每个单独元素运行各种迭代,同时检查它们是否可被二整除,直到它们达到根据其在新排序的索引值位置范围内的位置建立的指定和假定值。如果在这样的一轮迭代中存在任何不符合这些预定义关键条件的情况,那么我们的代码将结果描述为“假”,这表示无法实现将此数组转换为相应的顺序排列。与此同时,相反,每个合规元素都会产生“true”结果,从而为我们的数组重组目标提供可行的积极方向。

结论

在这篇文章中,我们深入研究了验证给定数组是否可以通过将其元素减半来转换为包含 1 到 N 范围内的数字的排列的挑战。我们为读者提供了有效解决这个问题的大纲、语法和算法过程。此外,我们还提供了两种可行的方法以及完整的 C++ 可执行代码示例。通过应用本文中强调的基于集合的技术或排序策略,读者可以满意地确定任何给定的数组是否符合合法排列的所有必要条件。

以上是检查给定的数组是否可以通过将元素减半来构成1到N的排列的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:tutorialspoint。如有侵权,请联系admin@php.cn删除
C:死亡还是简单地发展?C:死亡还是简单地发展?Apr 24, 2025 am 12:13 AM

1)c relevantduetoItsAverity and效率和效果临界。2)theLanguageIsconTinuellyUped,withc 20introducingFeaturesFeaturesLikeTuresLikeSlikeModeLeslikeMeSandIntIneStoImproutiMimproutimprouteverusabilityandperformance.3)

C在现代世界中:应用和行业C在现代世界中:应用和行业Apr 23, 2025 am 12:10 AM

C 在现代世界中的应用广泛且重要。1)在游戏开发中,C 因其高性能和多态性被广泛使用,如UnrealEngine和Unity。2)在金融交易系统中,C 的低延迟和高吞吐量使其成为首选,适用于高频交易和实时数据分析。

C XML库:比较和对比选项C XML库:比较和对比选项Apr 22, 2025 am 12:05 AM

C 中有四种常用的XML库:TinyXML-2、PugiXML、Xerces-C 和RapidXML。1.TinyXML-2适合资源有限的环境,轻量但功能有限。2.PugiXML快速且支持XPath查询,适用于复杂XML结构。3.Xerces-C 功能强大,支持DOM和SAX解析,适用于复杂处理。4.RapidXML专注于性能,解析速度极快,但不支持XPath查询。

C和XML:探索关系和支持C和XML:探索关系和支持Apr 21, 2025 am 12:02 AM

C 通过第三方库(如TinyXML、Pugixml、Xerces-C )与XML交互。1)使用库解析XML文件,将其转换为C 可处理的数据结构。2)生成XML时,将C 数据结构转换为XML格式。3)在实际应用中,XML常用于配置文件和数据交换,提升开发效率。

C#vs. C:了解关键差异和相似之处C#vs. C:了解关键差异和相似之处Apr 20, 2025 am 12:03 AM

C#和C 的主要区别在于语法、性能和应用场景。1)C#语法更简洁,支持垃圾回收,适用于.NET框架开发。2)C 性能更高,需手动管理内存,常用于系统编程和游戏开发。

C#与C:历史,进化和未来前景C#与C:历史,进化和未来前景Apr 19, 2025 am 12:07 AM

C#和C 的历史与演变各有特色,未来前景也不同。1.C 由BjarneStroustrup在1983年发明,旨在将面向对象编程引入C语言,其演变历程包括多次标准化,如C 11引入auto关键字和lambda表达式,C 20引入概念和协程,未来将专注于性能和系统级编程。2.C#由微软在2000年发布,结合C 和Java的优点,其演变注重简洁性和生产力,如C#2.0引入泛型,C#5.0引入异步编程,未来将专注于开发者的生产力和云计算。

C#vs. C:学习曲线和开发人员的经验C#vs. C:学习曲线和开发人员的经验Apr 18, 2025 am 12:13 AM

C#和C 的学习曲线和开发者体验有显着差异。 1)C#的学习曲线较平缓,适合快速开发和企业级应用。 2)C 的学习曲线较陡峭,适用于高性能和低级控制的场景。

C#vs. C:面向对象的编程和功能C#vs. C:面向对象的编程和功能Apr 17, 2025 am 12:02 AM

C#和C 在面向对象编程(OOP)中的实现方式和特性上有显着差异。 1)C#的类定义和语法更为简洁,支持如LINQ等高级特性。 2)C 提供更细粒度的控制,适用于系统编程和高性能需求。两者各有优势,选择应基于具体应用场景。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。