热门标签 | 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

推荐阅读
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 火星商店问题:线段树分治与持久化Trie树的应用
    本题涉及编号为1至n的火星商店,每个商店有一个永久商品价值v。操作包括每天在指定商店增加一个新商品,以及查询某段时间内某些商店中所有商品(含永久商品)与给定密码值的最大异或结果。通过线段树分治和持久化Trie树来高效解决此问题。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文探讨了如何在模运算下高效计算组合数C(n, m),并详细介绍了乘法逆元的应用。通过扩展欧几里得算法求解乘法逆元,从而实现除法取余的计算。 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • andr ... [详细]
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社区 版权所有