📜  以两种方式解码给定模式(Flipkart 面试问题)

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

以两种方式解码给定模式(Flipkart 面试问题)

发送者在加密数字的同时向接收者发送一个二进制字符串。你会得到一个加密形式的字符串。现在,接收者需要对字符串进行解码,解码时有两种方法。

设加密的二进制字符串为 P[],实际字符串为 S[]。

First, receiver starts with first character as 0; 
S[0] = 0 // First decoded bit is 1
Remaining bits or S[i]s are decoded using following formulas.
P[1] = S[1] + S[0] 
P[2] = S[2] + S[1] + S[0] 
P[3] = S[3] + S[2] + S[1] 
and so on ...

Second, Receiver starts with first character as 1; 
S[0] = 1 // First decoded bit is 1
Remaining bits or S[i]s are decoded using following formulas.
P[1] = S[1] + S[0]  
P[2] = S[2] + S[1] + S[0] 
P[3] = S[3] + S[2] + S[1] 
and so on ...

您需要在第一种和第二种技术的评估之后打印使用两个不同生成的两个字符串。如果任何字符串包含其他二进制数,则需要打印 NONE。

Input1; 0123210
Output: 0111000, NONE

Explanation for first output
S[0] = 0, 
P[1] = S[1] + S[0], S[1] = 1
P[2] = S[2] + S[1] + S[0], S[2] = 1
P[3] = S[3] + S[2] + S[1], S[3] = 1
P[4] = S[4] + S[3] + S[2], S[4] = 0 
P[5] = S[5] + S[4] + S[3], S[5] = 0
P[6] = S[6] + S[5] + S[4], S[6] = 0

Explanation for second output 
S[0] = 1,
P[1] = S[1] + S[0], S[1] = 0
P[2] = s[2] + S[1] + S[0], S[2] = 1
P[3] = S[3] + S[2] + S[1], S[3] = 2, not a binary character so NONE.

资料来源:Flipkart 采访 |设置 9(校内)
解决这个问题的想法很简单,我们跟踪最后两个解码位。当前位 S[i] 总是可以通过从 P[i] 中减去最后两个解码位来计算。

以下是上述思想的实现。我们将最后两个解码位存储在“第一”和“第二”中。

C++
#include
using namespace std;
 
// This function prints decoding of P[] with first decoded
// number as 'first'. If the decoded numbers contain anything
// other than 0, then "NONE" is printed
void decodeUtil(int P[], int n, int first)
{
    int S[n];  // array to store decoded bit pattern
    S[0] = first;  // The first number is always the given number
 
    int second = 0;  // Initialize second
 
    // Calculate all bits starting from second
    for (int i = 1; i < n; i++)
    {
        S[i] = P[i] -  first - second;
        if (S[i] != 1 && S[i] != 0)
        {
            cout << "NONE\n";
            return;
        }
        second = first;
        first = S[i];
    }
 
    // Print the output array
    for (int i = 0; i < n; i++)
       cout << S[i];
    cout << endl;
}
 
// This function decodes P[] using two techniques
// 1) Starts with 0 as first number 2) Starts 1 as first number
void decode(int P[], int n)
{
    decodeUtil(P, n, 0);
    decodeUtil(P, n, 1);
}
 
int main()
{
    int P[] = {0, 1, 2, 3, 2, 1, 0};
    int n = sizeof(P)/sizeof(P[0]);
    decode(P, n);
    return 0;
}


Java
class GFG{
     
// This function prints decoding of P[]
// with first decoded number as 'first'.
// If the decoded numbers contain anything
// other than 0, then "NONE" is printed
public static void decodeUtil(int P[], int n,
                              int first)
{
    // Array to store decoded bit pattern
    int S[] = new int[n];
     
    // The first number is always
    // the given number
    S[0] = first; 
     
    // Initialize second
    int second = 0; 
     
    // Calculate all bits starting
    // from second
    for(int i = 1; i < n; i++)
    {
        S[i] = P[i] - first-second;
         
        if (S[i] != 1 && S[i] != 0)
        {
            System.out.println("NONE");
            return;
        }
        second = first;
        first = S[i];
    }
     
    // Print the output array
    for(int i = 0; i < n; i++)
    {
        System.out.print(S[i]);
    }
    System.out.println();
}
 
// Driver code
public static void main(String []args)
{
    int P[] = { 0, 1, 2, 3, 2, 1, 0 };
    int n = P.length;
     
    // This function decodes P[] using
    // two techniques 1) Starts with 0
    // as first number 2) Starts 1 as
    // first number
    decodeUtil(P, n, 0);
    decodeUtil(P, n, 1);
}
}
 
// This code is contributed by avanitrachhadiya2155


Python3
# This function prints decoding of P[] with
# first decoded number as 'first'. If the
# decoded numbers contain anything other
# than 0, then "NONE" is printed
def decodeUtil(P, n, first):
    S = [0 for i in range(n)]
     
    # array to store decoded bit pattern
    S[0] = first # The first number is
                 # always the given number
 
    second = 0
     
    # Initialize second
 
    # Calculate all bits starting from second
    for i in range(1, n, 1):
        S[i] = P[i] - first - second
        if (S[i] != 1 and S[i] != 0):
            print("NONE")
            return
     
        second = first
        first = S[i]
 
    # Print the output array
    for i in range(0, n, 1):
        print(S[i], end = "")
    print("\n", end = "")
 
# This function decodes P[] using
# two techniques
# 1) Starts with 0 as first number
# 2) Starts 1 as first number
def decode(P, n):
    decodeUtil(P, n, 0)
    decodeUtil(P, n, 1)
 
# Driver Code
if __name__ == '__main__':
    P = [0, 1, 2, 3, 2, 1, 0]
    n = len(P)
    decode(P, n)
     
# This code is contributed by
# Shashank_Sharma


C#
using System;
 
class GFG{
     
// This function prints decoding of P[]
// with first decoded number as 'first'.
// If the decoded numbers contain anything
// other than 0, then "NONE" is printed
static void decodeUtil(int[] P, int n, int first)
{
     
    // Array to store decoded bit pattern
    int[] S = new int[n];
     
    // The first number is always
    // the given number
    S[0] = first;
     
    // Initialize second
    int second = 0; 
     
    // Calculate all bits starting
    // from second
    for(int i = 1; i < n; i++)
    {
        S[i] = P[i] - first - second;
         
        if (S[i] != 1 && S[i] != 0)
        {
            Console.WriteLine("NONE");
            return;
        }
        second = first;
        first = S[i];
    }
     
    // Print the output array
    for(int i = 0; i < n; i++)
    {
        Console.Write(S[i]);
    }
    Console.WriteLine();
}
 
// Driver code
static public void Main()
{
    int[] P = { 0, 1, 2, 3, 2, 1, 0 };
    int n = P.Length;
     
    // This function decodes P[] using
    // two techniques 1) Starts with 0
    // as first number 2) Starts 1 as
    // first number
    decodeUtil(P, n, 0);
    decodeUtil(P, n, 1);
}
}
 
// This code is contributed by rag2127


PHP


Javascript


输出:

0111000
NONE

时间复杂度:O(n)