使用倒置帕斯卡三角形将给定数组加密为单个数字
给定一个长度为N (N > 1) 的数组arr[]包含正整数,任务是使用倒帕斯卡三角形将数组的数字加密为单个数字,如下所示。
- 从数组的开头找到两个相邻元素的总和。
- 仅将总和替换为和的单位位置的数字。
- 用这种方式形成的值替换所有数组元素并继续,直到只剩下两个元素。
- 最后两个元素连接在一起。
例子:
Input: arr[] = {4, 5, 6, 7}
Output: 04
Explanation:
Input: arr[] = {1, 2, 3}
Output: 35
Explanation:
Input: arr[] = {14, 5}
Output: 145
Explanation: As there were two elements they are appended together
方法:这个问题可以使用基于以下思想的递归来解决:
Calculate the sum of all ith with (i-1)th element and mod by 10 to get least significant digit for next operation until the whole container becomes of length 2.
请按照以下步骤解决问题:
- 使用递归函数并执行以下操作:
- 遍历数字以计算相邻元素的总和并用10取模得到单个最低有效数字为numbers[i]=(numbers[i]+numbers[i+1])%10
- 从数组中删除最后一个元素,因为每次操作后都会减少一个元素。
- 继续此过程,直到只剩下2 个元素。
下面是上述方法的实现:
C++14
// C++ code for the above approach:
#include
using namespace std;
// Recursive function to find the encryption
string digitEncrypt(vector& numbers)
{
int N = numbers.size();
string ans;
// If the value of N is 2
if (N == 2) {
if (numbers[0] == 0 && numbers[1] == 0)
return "00";
else if (numbers[0] == 0)
return "0" + to_string(numbers[1]);
return to_string(numbers[0])
+ to_string(numbers[1]);
}
for (int i = 0; i < N - 1; i++)
numbers[i] = (numbers[i]
+ numbers[i + 1])
% 10;
numbers.pop_back();
return digitEncrypt(numbers);
}
// Drivers code
int main()
{
vector numbers = { 4, 5, 6, 7 };
// Function call
cout << digitEncrypt(numbers);
return 0;
}
输出
04
时间复杂度: O(N 2 )
辅助空间: O(N)