以下是编程面试练习题 处理这个问题的聪明方法是什么?
数字M以相反的顺序存储在数组中。例如,数字274存储在以下数组中:
A[0]= 4 A[1]=7 A[2]=2
编写一个给定数字A表示某个数字的函数,返回数字M * 17的十进制表示的数字之和。数组大小可能非常大(超过2,000,000个元素)。
答案 0 :(得分:3)
想象一下,你手写的乘以153乘以17。它看起来像这样:
153
17
---
51
85
17
----
2601
但实际上你并不需要保存完整的结果;你只需要随身携带数字。所以在第一步之后,你知道最后一个数字是1,然后你带5。然后在第二步之后你知道第二个数字是0,然后你带9.然后在第三步之后你知道第三个数字是6,随身携带2.当你的数字用完时,你只需要添加数字。 (你不能携带超过16个,所以你只需考虑两个案例。)
答案 1 :(得分:2)
以下代码将在O(n)中执行此操作。
#include <iostream>
#include <vector>
int times_17_dec_digits_sum(const vector<int> &A)
{
int sum = 0, carry = 0;
for (int i = 0; i < A.size(); i++) {
int perdigitsum = A[i]*17+carry;
sum += perdigitsum % 10;
carry = perdigitsum / 10;
}
return sum + carry;
}
int main()
{
std::vector<int> b;
b.push_back(3);
b.push_back(5);
b.push_back(1);
std::cout << times_17_dec_digits_sum(b) << std::endl;
return 0;
}
答案 2 :(得分:2)
因为你在乘以17后加上所有数字,你可以计算出每个元素的数字总和:
17*3 = 51 => 5+1 = 6
17*5 = 85 => 8+5 = 13
17*1 = 17 => 1+7 = 8
6 + 13 + 8 = 27 => 2+7=9
答案 3 :(得分:1)
三招:
17 x
,请使用(10 + 8 -1)x
;然后10 x
,转移位置;然后8 x
,位移。E.g:
17 * [3,5,1] =
7 * [3,5,1,0] + [0,3,5,1] =
[3,5,1,0]<<3 - [3,5,1,0] + [0,3,5,1]
这些都是非常快速的操作,您可以按元素执行:
A[i] = A[i]<<3 - A[i] + A[i+1];
答案 4 :(得分:0)
将数字分解(或者更确切地说不构成)为十进制数字。循环容器将元素乘以17,取最后一个数字并将其与结果相加,将其余数字作为余数,并将其添加到下一次迭代中的乘法结果中。完成数组后,将余数中的数字添加到结果中。
int times17( const std::vector<int>& a ) {
int result = 0, remainder = 0;
for ( std::vector<int>::const_iterator it = a.begin(), end = a.end(); it != end; ++it )
{
int tmp = 17* *it + remainder;
remainder = tmp / 10;
result += tmp - remainder*10;
}
while ( remainder > 0 ) {
result += remainder % 10;
remainder /= 10;
}
return result;
}