📌  相关文章
📜  重复删除奇数索引元素后的最后一个剩余元素

📅  最后修改于: 2022-05-13 01:56:05.163000             🧑  作者: Mango

重复删除奇数索引元素后的最后一个剩余元素

给定一个正整数N ,任务是在重复从序列中删除所有奇数索引元素后打印序列[1, N]中的最后一个剩余元素。

例子:

朴素方法:解决上述问题的朴素方法是存储序列。迭代序列并从中删除奇数索引元素。重复上述步骤,直到只剩下一个元素。

时间复杂度:O(N logN)
辅助空间:O(1)

有效方法:考虑以下观察:

  • 在第一步中,所有奇数元素将被删除,差异为2
  • 第二步,所有偶数元素都会被移除,从2开始,相差4
  • 第二步,所有偶数元素都会被移除,从4开始,相差8
  • 同样,在下一步中,将删除所有差异为16的元素,依此类推。
  • 因此,在每一步中,您都可以看到差异为2 X的元素将被移除。
  • 在这样做的过程中,除了序列中存在的 2 的最大幂之外,最终将删除所有元素。

根据以上观察,可以得出:

下面是上述方法的实现。

C++
#include 
#include
using namespace std;
int lastBlock(int N)
{
 
    // finding power of 2 less than or equal N
    int largestPower = log2(N);
 
    // returning the last remaining number
    return pow(2,largestPower);
}
 
// Driver code
int main()
{
 
    int N = 10;
 
    cout << lastBlock(N);
    return 0;
}
 
// This code is contributed by maddler.


Java
// Java program for the above approach
import java.io.*;
 
class GFG {
 
  // Function to find last remaining element
  public static int lastBlock(int N) {
 
    // finding power of 2 less than or equal N
    int largestPower = (int)(Math.log(N) / Math.log(2));
 
    // returning the last remaining number
    return (int)(Math.pow(2, largestPower));
 
  }
 
  // Driver code
  public static void main(String[] args)
  {
    int N = 10;
 
    // Function Call
    System.out.println(lastBlock(N));
  }
}
 
// This code is contributed by code_hunt.


Python3
# Python program for above approach.
import math
 
# Function to find last remaining element
def lastBlock(N):
 
    # finding power of 2 less than or equal N
    largestPower = (int)(math.log(N, 2))
     
    # returning the last remaining number
    return (int)(math.pow(2, largestPower))
 
 
# Driver Code
N = 10
 
# Function Call
print(lastBlock(N))


C#
// C# program for the above approach
using System;
 
class GFG {
 
  // Function to find last remaining element
  public static int lastBlock(int N) {
 
    // finding power of 2 less than or equal N
    int largestPower = (int)(Math.Log(N) / Math.Log(2));
 
    // returning the last remaining number
    return (int)(Math.Pow(2, largestPower));
 
  }
 
  // Driver code
  public static void Main(String[] args)
  {
    int N = 10;
 
    // Function Call
    Console.Write(lastBlock(N));
  }
}
 
// This code is contributed by shivanisinghss2110


Javascript


输出
8

时间复杂度: O(1)
辅助空间: O(1)