📌  相关文章
📜  找到最后一个能够翻转二进制字符串中的字符的玩家

📅  最后修改于: 2021-09-24 05:00:14             🧑  作者: Mango

给定一个长度为N的二进制字符串S ,如果两个玩家AB按照以下规则进行最佳游戏,则任务是找到游戏的获胜者:

  • 玩家 A 总是开始游戏。
  • 在玩家的第一个回合中,他可以移动到由‘0’组成的任何索引(基于 1 的索引)并使其成为‘1’
  • 对于随后的回合,如果任何玩家处于索引i ,那么他可以移动到它的相邻索引之一,如果它包含0 ,并在移动后将其转换为‘1’
  • 如果任何玩家在他的回合中无法移动到任何位置,则该玩家输掉游戏。

任务是找到游戏的赢家。

例子:

方法:这个想法是将给定数组arr[]中仅由0组成的所有子字符串的长度存储在另一个数组中,比如V[] 。现在,出现以下情况:

  1. 如果 V 的大小为 0 在这种情况下,数组不包含任何0 。因此,玩家 A不能采取任何行动并输掉比赛。因此,打印Player B
  2. 如果 V 的大小为 1 在这种情况下,有 1 个仅由0组成的子字符串,例如长度为L 。如果L 的值为奇数,则玩家 A赢得比赛。否则,玩家 B赢得比赛。
  3. 在所有其他情况下:分别在firstsecond中存储0 s 的最大和第二大连续段的长度。当且仅当first 的值为奇数且(first + 1)/2 > second 时,玩家 A才能赢得比赛。否则,玩家 B赢得比赛。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Function to check if player A wins
// the game or not
void findWinner(string a, int n)
{
    // Stores size of the groups of 0s
    vector v;
 
    // Stores size of the group of 0s
    int c = 0;
 
    // Traverse the array
    for (int i = 0; i < n; i++) {
 
        // Increment c by 1 if a[i] is 0
        if (a[i] == '0') {
            c++;
        }
 
        // Otherwise, push the size
        // in array and reset c to 0
        else {
            if (c != 0)
                v.push_back(c);
            c = 0;
        }
    }
    if (c != 0)
        v.push_back(c);
 
    // If there is no substring of
    // odd length consisting only of 0s
    if (v.size() == 0) {
        cout << "Player B";
        return;
    }
 
    // If there is only 1 substring of
    // odd length consisting only of 0s
    if (v.size() == 1) {
        if (v[0] & 1)
            cout << "Player A";
 
        // Otherwise
        else
            cout << "Player B";
        return;
    }
 
    // Stores the size of the largest
    // and second largest substrings of 0s
    int first = INT_MIN;
    int second = INT_MIN;
 
    // Traverse the array v[]
    for (int i = 0; i < v.size(); i++) {
 
        // If current element is greater
        // than first, then update both
        // first and second
        if (a[i] > first) {
            second = first;
            first = a[i];
        }
 
        // If arr[i] is in between
        // first and second, then
        // update second
        else if (a[i] > second
                 && a[i] != first)
            second = a[i];
    }
 
    // If the condition is satisfied
    if ((first & 1)
        && (first + 1) / 2 > second)
        cout << "Player A";
    else
        cout << "Player B";
}
 
// Driver Code
int main()
{
    string S = "1100011";
    int N = S.length();
    findWinner(S, N);
 
    return 0;
}


Java
// Java program for the above approach
import java.util.*;
public class GFG
{
 
  // Function to check if player A wins
  // the game or not
  static void findWinner(String a, int n)
  {
 
    // Stores size of the groups of 0s
    Vector v = new Vector(); 
 
    // Stores size of the group of 0s
    int c = 0;
 
    // Traverse the array
    for (int i = 0; i < n; i++)
    {
 
      // Increment c by 1 if a[i] is 0
      if (a.charAt(i) == '0')
      {
        c++;
      }
 
      // Otherwise, push the size
      // in array and reset c to 0
      else
      {
        if (c != 0)
          v.add(c);
        c = 0;
      }
    }
    if (c != 0)
      v.add(c);
 
    // If there is no substring of
    // odd length consisting only of 0s
    if (v.size() == 0)
    {
      System.out.print("Player B");
      return;
    }
 
    // If there is only 1 substring of
    // odd length consisting only of 0s
    if (v.size() == 1)
    {
      if ((v.get(0) & 1) != 0)
        System.out.print("Player A");
 
      // Otherwise
      else
        System.out.print("Player B");
      return;
    }
 
    // Stores the size of the largest
    // and second largest substrings of 0s
    int first = Integer.MIN_VALUE;
    int second = Integer.MIN_VALUE;
 
    // Traverse the array v[]
    for (int i = 0; i < v.size(); i++)
    {
 
      // If current element is greater
      // than first, then update both
      // first and second
      if (a.charAt(i) > first) {
        second = first;
        first = a.charAt(i);
      }
 
      // If arr[i] is in between
      // first and second, then
      // update second
      else if (a.charAt(i) > second
               && a.charAt(i) != first)
        second = a.charAt(i);
    }
 
    // If the condition is satisfied
    if ((first & 1) != 0
        && (first + 1) / 2 > second)
      System.out.print("Player A");
    else
      System.out.print("Player B");
  }
 
  // Driver code
  public static void main(String[] args)
  {
    String S = "1100011";
    int N = S.length();
    findWinner(S, N);
  }
}
 
// This code is contributed by divyeshrabadiya07.


Python3
# Python3 program for the above approach
import sys
 
# Function to check if player A wins
# the game or not
def findWinner(a, n) :
 
    # Stores size of the groups of 0s
    v = []
 
    # Stores size of the group of 0s
    c = 0
 
    # Traverse the array
    for i in range(0, n) :
 
        # Increment c by 1 if a[i] is 0
        if (a[i] == '0') :
            c += 1
 
        # Otherwise, push the size
        # in array and reset c to 0
        else :
            if (c != 0) :
                v.append(c)
            c = 0
     
    if (c != 0) :
        v.append(c)
 
    # If there is no substring of
    # odd length consisting only of 0s
    if (len(v) == 0) :
        print("Player B", end = "")
        return
 
    # If there is only 1 substring of
    # odd length consisting only of 0s
    if (len(v) == 1) :
        if ((v[0] & 1) != 0) :
            print("Player A", end = "")
 
        # Otherwise
        else :
            print("Player B", end = "")
        return
 
    # Stores the size of the largest
    # and second largest substrings of 0s
    first = sys.minsize
    second = sys.minsize
 
    # Traverse the array v[]
    for i in range(len(v)) :
 
        # If current element is greater
        # than first, then update both
        # first and second
        if (a[i] > first) :
            second = first
            first = a[i]
 
        # If arr[i] is in between
        # first and second, then
        # update second
        elif (a[i] > second and a[i] != first) :
            second = a[i]
 
    # If the condition is satisfied
    if (((first & 1) != 0) and (first + 1) // 2 > second) :
        print("Player A", end = "")
    else :
        print("Player B", end = "")
 
S = "1100011"
N = len(S)
findWinner(S, N)
 
# This code is contributed by divyesh072019.


C#
// C# program to implement
// the above approach
using System;
using System.Collections.Generic;
using System.Linq;
 
class GFG{
 
  // Function to check if player A wins
  // the game or not
  static void findWinner(string a, int n)
  {
 
    // Stores size of the groups of 0s
    List v = new List(); 
 
    // Stores size of the group of 0s
    int c = 0;
 
    // Traverse the array
    for (int i = 0; i < n; i++)
    {
 
      // Increment c by 1 if a[i] is 0
      if (a[i] == '0')
      {
        c++;
      }
 
      // Otherwise, push the size
      // in array and reset c to 0
      else
      {
        if (c != 0)
          v.Add(c);
        c = 0;
      }
    }
    if (c != 0)
      v.Add(c);
 
    // If there is no substring of
    // odd length consisting only of 0s
    if (v.Count == 0)
    {
      Console.Write("Player B");
      return;
    }
 
    // If there is only 1 substring of
    // odd length consisting only of 0s
    if (v.Count == 1)
    {
      if ((v[0] & 1) != 0)
        Console.Write("Player A");
 
      // Otherwise
      else
        Console.Write("Player B");
      return;
    }
 
    // Stores the size of the largest
    // and second largest substrings of 0s
    int first = Int32.MinValue;
    int second = Int32.MinValue;
 
    // Traverse the array v[]
    for (int i = 0; i < v.Count; i++)
    {
 
      // If current element is greater
      // than first, then update both
      // first and second
      if (a[i] > first) {
        second = first;
        first = a[i];
      }
 
      // If arr[i] is in between
      // first and second, then
      // update second
      else if (a[i] > second
               && a[i] != first)
        second = a[i];
    }
 
    // If the condition is satisfied
    if ((first & 1) != 0
        && (first + 1) / 2 > second)
      Console.Write("Player A");
    else
      Console.Write("Player B");
  }
 
 
// Driver Code
public static void Main(String[] args)
{
    string S = "1100011";
    int N = S.Length;
    findWinner(S, N);
}
}
 
// This code is contributed by splevel62.


Javascript


输出:
Player A

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

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程