热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在C++中定位数组中特定数字的最后一个位置

如何在 C++中找到数组中一个数字的最后一个索引原文:https://www . geeksforgeeks . org/如何查

如何在 C++中找到数组中一个数字的最后一个索引

原文:https://www . geeksforgeeks . org/如何查找 c 数组中最后一个数字的索引/

给定一个由 N 整数和数字 K 组成的数组 arr[] ,任务是在 arr[] 中找到最后一个出现的 K 。如果元素不存在,则返回 -1
示例:

输入: arr[] = {1,3,4,2,1,8},K = 1
输出: 4
说明:
在索引 0 和索引 4 有两次出现 1。但是最后一次出现在索引 4。
输入: arr[] = {3,4,5,6,7},K = 2
输出: -1
解释:
因为数组中不存在 2。

方法 1: 使用递归


  • 从给定数组的最后一个索引递归迭代:

    • 基本情况:如果我们递归地到达起始索引,这意味着给定的元素 K 不存在于数组中。



if(idx <0) {
return -1;
}


  • 返回语句:如果递归调用中的当前元素等于 K ,则从函数返回当前索引。

if(arr[idx]==K) {
return idx;
}


  • 递归调用:如果当前索引处的元素不等于 K ,则递归调用进行下一次迭代。

return recursive_function(arr, idx - 1)

下面是上述方法的实现:

卡片打印处理机(Card Print Processor 的缩写)

// C++ program for the above approach
#include
using namespace std;
// Recursive function to find the last
// index of the given number K
int findIndex(int arr[], int idx, int K)
{
    // Base Case
    if (idx <0)
        return -1;
    // Return Statement
    if (arr[idx] == K) {
        return idx;
    }
    // Recursive Call
    return findIndex(arr, idx - 1, K);
}
// Driver Code
int main()
{
    int arr[] = { 3, 1, 4, 4, 2, 3, 1 };
    int N = sizeof(arr) / sizeof(arr[0]);
    int K = 4;
    // Function call
    cout <    return 0;
}

Output: 

3

时间复杂度: O(N),其中 N 为数组长度。
方法二:**使用内置函数 find() 和 find_if() :
思路是从数组末尾找到第一个元素,从数组开头找到最后一个元素。以下是步骤:


  1. 反转给定的数组。

  2. 使用 find()函数找到反向数组中第一个值为 K 的元素。

  3. 如果 find 函数返回的迭代器指向数组的末尾,则该元素不在数组中。

  4. 否则使用距离()功能找到 K 在这个反转数组中的位置(比如位置)。

  5. 获取给定数组打印中 K 的最后一个索引的距离(N–pos–1)

下面是上述方法的实现:
使用 find()

C++

// C++ program for the above approach
#include
using namespace std;
// Function to find the last index of
// the given number K
int findIndex(int arr[], int N, int K)
{
    // Reverse the given array arr[]
    reverse(arr, arr + N);
    // Find the first occurrence of K
    // in this reversed array
    auto it = find(arr, arr + N, K);
    // If the element is not present
    // then return "-1"
    if (it == arr + N) {
        return -1;
    }
    // Else return the index found
    return (N - distance(arr, it) - 1);
}
// Driver Code
int main()
{
    int arr[] = { 3, 1, 4, 4, 2, 3, 1 };
    int N = sizeof(arr) / sizeof(arr[0]);
    int K = 4;
    // Function call
    cout <    return 0;
}

使用 find_if()

C++

// C++ program for the above approach
#include
using namespace std;
// Comparator structure for finding
// index of element with value K
struct comparator {
    int elem;
    comparator(int const& i)
        : elem(i)
    {
    }
    bool operator()(int const& i)
    {
        return (i == elem);
    }
};
// Function to find the last index of
// the given number K
int findIndex(int arr[], int N, int K)
{
    // Reverse the given array arr[]
    reverse(arr, arr + N);
    // Find the first occurrence of K
    // in this reversed array
    auto it = find_if(arr, arr + N,
                      comparator(K));
    // If the element is not present
    // then return "-1"
    if (it == arr + N) {
        return -1;
    }
    // Else return the index found
    return (N - distance(arr, it) - 1);
}
// Driver Code
int main()
{
    int arr[] = { 3, 1, 4, 4, 2, 3, 1 };
    int N = sizeof(arr) / sizeof(arr[0]);
    int K = 4;
    // Function call
    cout <    return 0;
}

Output: 

3

时间复杂度: O(N) ,其中 N 是给定数组中元素的个数。

方法 3: (迭代方式)

使用循环查找最后一个位置。

下面是上述方法的实现

C++

// CPP program for the above approach
#include
using namespace std;
int findIndex(int arr[], int idx, int K)
{
    // Traversing the array from
    // last position
    for (int i = idx; i >= 0; i--) {
        if (arr[i] == K)
            return i;
    }
    return -1;
}
// Driver Code
int main()
{
    int arr[] = { 3, 1, 4, 4, 2, 3, 1 };
    int N = sizeof(arr) / sizeof(arr[0]);
    int K = 4;
    // Function call
    cout <    return 0;
}

输出:

3

推荐阅读
  • PAT甲级 1068 寻找更多硬币 (30分) 01背包问题与路径优化
    PAT甲级 1068 寻找更多硬币 (30分) 01背包问题与路径优化 ... [详细]
  • 本文深入探讨了 AdoDataSet RecordSet 的序列化与反序列化技术,详细解析了将 RecordSet 转换为 XML 格式的方法。通过使用 Variant 类型变量和 TStringStream 流对象,实现数据集的高效转换与存储。该方法不仅提高了数据传输的灵活性,还增强了数据处理的兼容性和可扩展性。 ... [详细]
  • 数据压缩与编解码技术优化
    编码的种类  编码(Encoding)在认知上是解释传入的刺激的一种基本知觉的过程。技术上来说,这是一个复杂的、多阶段的转换过程,从较为客观的感觉输入& ... [详细]
  • 通过移除单一数字优化数据集 ... [详细]
  • 深入解析C语言中的大小端字节序存储机制
    在C语言中,当编译器执行“创建变量”的指令时,会为该变量在内存中分配相应的存储空间。对于整型变量,其值通常以二进制补码形式存储。此外,不同系统采用的大端或小端字节序对数据的实际存储方式有显著影响,理解这些机制有助于开发者更好地控制数据的读写过程。 ... [详细]
  • 在《数据库技术深度解析:Oracle与SQL优化系列之第五篇》中,我们对Oracle数据库的SQL优化进行了阶段性总结。本文继续探讨了使用UNION ALL替代UNION的优化策略,特别是在可能的情况下,以提高查询性能和效率。此外,还深入分析了这一变更对数据完整性和查询结果的影响,提供了多个实际案例和测试结果,帮助读者更好地理解和应用这些优化技巧。 ... [详细]
  • C/C++利用栈和队列实现停车场管理系统【C++教程】
    数据结构的课程设计一般都不是很好理解,今天小编为大家总结了一下c和c++版本的常见栈和队列的的停车场管理程序,需要 ... [详细]
  • c语言中阶乘的精确值
     对于大数的操作,可能超出int,甚至long的表示范围,对此,可以使用数组来存储大数,下列代码为求1000以内数的阶乘的代码,代码如下:#include&amp;amp; ... [详细]
  • 图像拼接技术深入解析:基于OpenCV 3.4的Stitching模块源码分析(下篇)
    本文继续深入探讨图像拼接技术,特别是在OpenCV 3.4的Stitching模块中的源码实现。通过与VLFeat的SIFT实现进行对比,详细分析了OpenCV在图像特征提取、匹配及拼接过程中的关键算法和技术细节,为读者提供了全面的技术解析和实践指导。 ... [详细]
  • 题目1:给定一个非空数组A,包含有N个整数,起始下标为0。数组包含有奇数个元素,其中除了唯一一个元素之外,其他 ... [详细]
  • PHP中如何使用hidef代替define优化效率?本文主要介绍了PHP中使用hidef扩展代替define提高性能,本文着重测试hidef的性能,同时提供了实例。希望对大家有所帮 ... [详细]
  • 本文旨在构建一个JavaScript函数,用于对用户输入的电子邮件地址和密码进行有效性验证。该函数将确保输入符合标准格式,并检查密码强度,以提升用户账户的安全性。通过集成正则表达式和条件判断语句,该方法能够有效防止常见的输入错误,同时提供即时反馈,改善用户体验。 ... [详细]
  • 在处理大文件上传时,服务端为何无法直接接收?这主要与 PHP 配置文件 `php.ini` 中的几个关键参数有关,如 `upload_max_filesize` 和 `post_max_size`。这些参数分别限制了单个文件的最大上传大小和整个 POST 请求的数据量。为了实现大文件的高效上传,可以通过文件分割与分片上传的方法来解决。本文将详细介绍这一实现方法,并提供相应的代码示例,帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 本文探讨了Node.js Cluster模块在多核CPU环境下的应用及其性能测试。通过安装`async`包并利用Node.js自带的`http`和`cluster`模块,创建了一个名为`cluster.js`的文件,该文件根据系统CPU核心数动态生成多个工作进程,以实现负载均衡和提高应用性能。实验结果表明,使用Cluster模块能够显著提升高并发场景下的响应速度和处理能力。 ... [详细]
  • 第一行第一列第一行第二列第二行第一列第二行第二列第二行第一列第二行第二列第三行第一列第三行第二列跨行colspan跨列rowspan手机充值办公设备、手机、耗材各种卡的汇总铅笔毛笔 ... [详细]
author-avatar
倾其h所有只为爱你
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有