以“xAyB”形式编码字符串,其中 x 和 y 并基于位数
给定两个数字字符串N和M ,任务是以“ xAyB ”的形式对给定字符串进行编码,其中:
- x 是 N 和 M 中相同且出现在相同索引上的数字的计数
- y 是 N 和 M 中相同但出现在不同索引上的数字的计数
例子:
Input: N = 123, M = 321
Output: “1A2B”
Explanation:
Digit 2 satisfies condition for x as count of digits that are same in N and M and are present on same indices
Digits 1 and 3 satisfy the condition for y as count of digits that are same in N and M but are present on different indices
Input: N = 123, M = 111
Output: “0A1B”
方法:可以使用散列和两指针方法解决问题。
- 将 N 和 M 转换为字符串以便于遍历
- 现在创建 2 个大小为 10 的散列来分别存储 N 和 M 中的数字频率
- 现在从 0-9 遍历一个循环并且:
- 将 hashN[i] 和 hashM[i] 的最小值添加到变量计数中
- 现在使用两个指针遍历数字以查找相同的数字计数,并出现在 N 和 M 的相同索引上。将计数存储在变量 same_dig_cnt
- 因此 x = same_dig_cnt, y = count。
- 现在将最终字符串返回为“xAyB”
下面是上述方法的实现:
C++
// C++ implementation of the above approach
#include
using namespace std;
// Function to encode strings as "xAyB"
string encodeStrings(int N, int M)
{
// Convert N and M to string
// for ease of traversal
string a = to_string(N), b = to_string(M);
// Create 2 hash of size 10
// to store frequency of digits
// in N and M respectively
vector hashN(10, 0);
for (char c : a)
hashN++;
vector hashM(10, 0);
for (char c : b)
hashM++;
int count = 0, same_dig_cnt = 0;
// Count of common digits
// irrespective of their positions
for (int i = 0; i < 10; i++)
count += min(hashN[i], hashM[i]);
// Find the count of digits
// that are same and occur on same indices
// in both N and M.
// Store the count in variable same_dig_cnt
for (int i = 0; i < a.length() && b.length(); i++)
if (a[i] == b[i])
same_dig_cnt++;
// Remove the count of digits that are
// not at same indices in both numbers
count -= same_dig_cnt;
// Therefore x = same_dig_cnt, y = count.
// Now return the final string as "xAyB"
string ans = "" + to_string(same_dig_cnt) + "A"
+ to_string(count) + "B";
return ans;
}
// Driver code
int main()
{
int N = 1807, M = 7810;
cout << "\"" << encodeStrings(N, M) << "\"";
return 0;
}
Java
// java implementation of the above approach
class GFG {
// Function to encode Strings as "xAyB"
static String encodeStrings(int N, int M)
{
// Convert N and M to String
// for ease of traversal
String a = Integer.toString(N), b = Integer.toString(M);
// Create 2 hash of size 10
// to store frequency of digits
// in N and M respectively
int[] hashN = new int[10];
for (int i = 0; i < 10; i++) {
hashN[i] = 0;
}
for(char c : a.toCharArray()) hashN++;
int[] hashM = new int[10];
for (int i = 0; i < 10; i++) {
hashM[i] = 0;
}
for(char c : b.toCharArray()) hashM++;
int count = 0, same_dig_cnt = 0;
// Count of common digits
// irrespective of their positions
for (int i = 0; i < 10; i++)
count += Math.min(hashN[i], hashM[i]);
// Find the count of digits
// that are same and occur on same indices
// in both N and M.
// Store the count in variable same_dig_cnt
for (int i = 0; i < a.length() && i < b.length(); i++)
if (a.charAt(i) == b.charAt(i))
same_dig_cnt++;
// Remove the count of digits that are
// not at same indices in both numbers
count -= same_dig_cnt;
// Therefore x = same_dig_cnt, y = count.
// Now return the final String as "xAyB"
String ans = "" + Integer.toString(same_dig_cnt) + "A" + Integer.toString(count) + "B";
return ans;
}
// Driver code
public static void main(String args[])
{
int N = 1807, M = 7810;
System.out.println("\"" + encodeStrings(N, M) + "\"");
}
}
// This code is contributed by Saurabh jaiswal
Python3
# Python code for the above approach
def encodeStrings(N, M):
# Convert N and M to string
# for ease of traversal
a = str(N)
b = str(M)
# Create 2 hash of size 10
# to store frequency of digits
# in N and M respectively
hashN = [0] * 10
for c in range(len(a)):
hashN[ord(a) - ord('0')] += 1
hashM = [0] * 10
for c in range(len(b)):
hashM[ord(b) - ord('0')] += 1
count = 0
same_dig_cnt = 0
# Count of common digits
# irrespective of their positions
for i in range(10):
count += min(hashN[i], hashM[i])
# Find the count of digits
# that are same and occur on same indices
# in both N and M.
# Store the count in variable same_dig_cnt
i = 0
while(i < len(a) and len(b)):
if (a[i] == b[i]):
same_dig_cnt += 1
i += 1
# Remove the count of digits that are
# not at same indices in both numbers
count -= same_dig_cnt
# Therefore x = same_dig_cnt, y = count.
# Now return the final string as "xAyB"
ans = str(same_dig_cnt) + "A" + str(count) + "B"
return ans
# Driver code
N = 1807
M = 7810
print(f"\"{encodeStrings(N, M)}\"")
# This code is contributed by Saurabh jaiswal
C#
// C# implementation of the above approach
using System;
class GFG {
// Function to encode strings as "xAyB"
static string encodeStrings(int N, int M)
{
// Convert N and M to string
// for ease of traversal
string a = N.ToString(), b = M.ToString();
// Create 2 hash of size 10
// to store frequency of digits
// in N and M respectively
int[] hashN = new int[10];
for (int i = 0; i < 10; i++) {
hashN[i] = 0;
}
foreach(char c in a) hashN++;
int[] hashM = new int[10];
for (int i = 0; i < 10; i++) {
hashM[i] = 0;
}
foreach(char c in b) hashM++;
int count = 0, same_dig_cnt = 0;
// Count of common digits
// irrespective of their positions
for (int i = 0; i < 10; i++)
count += Math.Min(hashN[i], hashM[i]);
// Find the count of digits
// that are same and occur on same indices
// in both N and M.
// Store the count in variable same_dig_cnt
for (int i = 0; i < a.Length && i < b.Length; i++)
if (a[i] == b[i])
same_dig_cnt++;
// Remove the count of digits that are
// not at same indices in both numbers
count -= same_dig_cnt;
// Therefore x = same_dig_cnt, y = count.
// Now return the final string as "xAyB"
string ans = "" + same_dig_cnt.ToString() + "A"
+ count.ToString() + "B";
return ans;
}
// Driver code
public static void Main()
{
int N = 1807, M = 7810;
Console.Write("\"" + encodeStrings(N, M) + "\"");
}
}
// This code is contributed by Samim Hossain Mondal.
Javascript
输出
"1A3B"
时间复杂度: O(D),其中 D 是 N 或 M 中的最大位数
辅助空间: O(D),其中 D 是 N 或 M 中的最大位数