c*******f 发帖数: 927 | 1 一个组全都是阿三。答得都不好,应该是挂了。看他们好像没有什么兴趣,没有电面就
给了on site,估计是给绿卡打广告
1. c
char* p = "hello";
char* q = "hello";
问是否p和q的值一样。
一样 而且“hello”的值不能被修改
2. C 和C++怎样在main函数之前print东西。
C可以用__attribute__( GNU C?), C++ 可以用class的onstructor,在main以前定
义一个global的class。
3. 编程题,输入一个整数x,输出y,要求y恰好比x大,并且数字只由3和5组成。
例如:in out
5 33
325 333
3556 5333
大家觉得题目算难么 还是我实在太菜了。。3有什么好的思路吗? |
k****r 发帖数: 807 | 2 3:
从尾巴往前找3变5,
1) 如果找不到在前面加3,后面都变3;
2)如果找到了,变5,后面也都变成3. |
c*******f 发帖数: 927 | 3 思路我有一点。。阿三们直接拿了个电脑来让我现场敲。。有些情况考虑的不周全,阿
三test的时候就跪了。
【在 k****r 的大作中提到】 : 3: : 从尾巴往前找3变5, : 1) 如果找不到在前面加3,后面都变3; : 2)如果找到了,变5,后面也都变成3.
|
c*******f 发帖数: 927 | 4 能不能写个pseudo code?看看具体是怎么样的 |
C*7 发帖数: 234 | 5 抱歉之前考虑不全。这样行不,从左侧开始,找到第一个不是3或5的,分三种可能:
(1)小于3就变3
(2)等于4就变5
(3)大于5的话,向左侧找3,找到变成5;如果左侧全是5,就加一位3。
然后右侧全补成3结束。
如果没找到不是3或5的,从最右端向左找3变5,同(3)。
【在 c*******f 的大作中提到】 : 能不能写个pseudo code?看看具体是怎么样的
|
c*******f 发帖数: 927 | 6 对 应该是这样。现场编的时候没有考虑到第一位之后大于5的情况。虽然后面想到了
但是前面用的是把结果直接放在一个int里,改起来不好改。如果用个数组存结果的每
一位应该会好一点。
一般面试会让现场敲代码,然后compile,在test的么。
【在 C*7 的大作中提到】 : 抱歉之前考虑不全。这样行不,从左侧开始,找到第一个不是3或5的,分三种可能: : (1)小于3就变3 : (2)等于4就变5 : (3)大于5的话,向左侧找3,找到变成5;如果左侧全是5,就加一位3。 : 然后右侧全补成3结束。 : 如果没找到不是3或5的,从最右端向左找3变5,同(3)。
|
C*7 发帖数: 234 | 7 是啊,int操作万一发现问题很难改。先转成string好些。电面大多要编译测试,
onsite很少见
【在 c*******f 的大作中提到】 : 对 应该是这样。现场编的时候没有考虑到第一位之后大于5的情况。虽然后面想到了 : 但是前面用的是把结果直接放在一个int里,改起来不好改。如果用个数组存结果的每 : 一位应该会好一点。 : 一般面试会让现场敲代码,然后compile,在test的么。
|
S********t 发帖数: 3431 | 8 楼主还没刷lc?
这题在lc上也就顶多easy吧
【在 c*******f 的大作中提到】 : 能不能写个pseudo code?看看具体是怎么样的
|
x*******4 发帖数: 5 | 9 按照你的解法,325 得出的结果是 533, 而不是333
【在 C*7 的大作中提到】 : 抱歉之前考虑不全。这样行不,从左侧开始,找到第一个不是3或5的,分三种可能: : (1)小于3就变3 : (2)等于4就变5 : (3)大于5的话,向左侧找3,找到变成5;如果左侧全是5,就加一位3。 : 然后右侧全补成3结束。 : 如果没找到不是3或5的,从最右端向左找3变5,同(3)。
|
C*7 发帖数: 234 | 10 第一个非3或5的是2,按(1)变成3,然后后面全补3结束了
【在 x*******4 的大作中提到】 : 按照你的解法,325 得出的结果是 533, 而不是333
|
|
|
j**j 发帖数: 4 | 11 这个题目可以从高位到低位,逐个确定位的value,每个位只能是3或者5,如果是小于
33333。。。,那么就输出33333.。。。如果小于35555.。。, 那么确定最高位位是3
,否则这个位就是5。然后记录下来,再推下一个。
public static int largerInteger(int num) {
int digits = 1;
int d = 1;
int upper = 5; // for value boundaries.
int lower = 3;
while (num / d >= 10) {
digits++;
d *= 10;
upper = upper * 10 + 5;
lower = lower * 10 + 3;
}
if (num >= upper) return lower + 3 * d * 10;
if (num < lower) return lower;
int curV = 0;
for (int i = digits; i > 0; i++) { //digit by digit.
curV *= 10;
lower -= 3 * d;
upper -= 5 * d;
if ((curV + 3) * d + lower > num) break; // result is found;
else if ((curV + 3) * d + upper > num) curV += 3; // if so, digit is
3;
else curV += 5; // every digit, maximum digit is 5;
d /= 10;
}
return (curV + 3) * d + lower;
} |
g*******e 发帖数: 140 | 12 可不可看做leetcode plus 1的变体呢?好像编程会简便一些:
int plus_one_35(int val) {
long long temp = 0;
int carry = 1;
if (val < 0) {
cout << 0;
return 0;
}
while(val > 0 || carry) {
int dig = val % 10;
if (dig + carry <= 3) {
dig = 3;
carry = 0;
} else if (dig + carry <= 5) {
dig = 5;
carry = 0;
} else {
dig = 3;
carry = 1;
}
temp *= 10;
temp += dig;
val /= 10;
}
// revert the dig
long long result = 0;
while(temp > 0) {
result *= 10;
result += temp % 10;
temp /= 10;
}
if (result > numeric_limits::max()) return 0;
return result;
}
3
【在 j**j 的大作中提到】 : 这个题目可以从高位到低位,逐个确定位的value,每个位只能是3或者5,如果是小于 : 33333。。。,那么就输出33333.。。。如果小于35555.。。, 那么确定最高位位是3 : ,否则这个位就是5。然后记录下来,再推下一个。 : public static int largerInteger(int num) { : int digits = 1; : int d = 1; : int upper = 5; // for value boundaries. : int lower = 3; : while (num / d >= 10) { : digits++;
|
l******s 发帖数: 3045 | 13 private static long nextNum(long num){
StringBuilder sb = new StringBuilder(num.ToString());
int first3 = -1, firstOther = -1;
for(int i = 0; i < sb.Length && firstOther == -1; i++)
if(sb[i] != '3' && sb[i] != '5') firstOther = i;
else if(first3 == -1 && sb[i] == '3') first3 = i;
if(firstOther != -1 && sb[firstOther] < '5')
if(sb[first3 = firstOther] < '3') sb[firstOther] = '3';
else sb[firstOther] = '5';
else if(first3 != -1) sb[first3] = '5';
else sb.Append('0');
for(int i = first3 + 1; i < sb.Length; i++) sb[i] = '3';
return Convert.ToInt64(sb.ToString());
} |
j**j 发帖数: 4 | 14 我最开始也是这么想的,也是可以做的,只是这样从低位到高位,前面确定的位数可能
会被重置为3.
比如:32532,前面确定了533后,因为后来2<3,确定的5又要变成3了。最后的结果又变
成了33333,而不是33533.
【在 g*******e 的大作中提到】 : 可不可看做leetcode plus 1的变体呢?好像编程会简便一些: : int plus_one_35(int val) { : long long temp = 0; : int carry = 1; : if (val < 0) { : cout << 0; : return 0; : } : while(val > 0 || carry) { : int dig = val % 10;
|
g*******e 发帖数: 140 | 15 嗯,你是对的。
如果沿着plus1的思路,一旦有一个数字升级,就需要回头重置已经生成的数
字为3,需要加上以下代码:
if (newdig > dig && has5) {
int newtemp = 0;
while(temp > 0) {
newtemp *= 10;
newtemp += 3;
temp /= 10;
}
temp = newtemp;
has5 = false;
}
代码就比较难看了。
【在 j**j 的大作中提到】 : 我最开始也是这么想的,也是可以做的,只是这样从低位到高位,前面确定的位数可能 : 会被重置为3. : 比如:32532,前面确定了533后,因为后来2<3,确定的5又要变成3了。最后的结果又变 : 成了33333,而不是33533.
|
t**n 发帖数: 272 | 16 这题可以从右往左(低位到高位)做。需要用一个carry_on标志 http://ideone.com/GU0odW
有一点比较tricky,一开始carry_on的初始值要设成true
我很好奇如果是一个可变的字符集,应该怎么做 |
g******3 发帖数: 73 | 17 step1: 找到由3和5构成的数字区间,
比如input 35, 那么区间 [33, 35, 53,55, 333],
比如input 250, 那么区间就是[333,335,353,355,533,535,553,555,3333];
step2: 在这个区间里面二分查找next large number,这个leetcode上有原体 |
g*******e 发帖数: 140 | 18 有什么好方法生成区间吗?以333为例,+1 3进位到5这样直到找到一个数字大于目标数
字?
第二步是不是就是二分找upper bound?
【在 g******3 的大作中提到】 : step1: 找到由3和5构成的数字区间, : 比如input 35, 那么区间 [33, 35, 53,55, 333], : 比如input 250, 那么区间就是[333,335,353,355,533,535,553,555,3333]; : step2: 在这个区间里面二分查找next large number,这个leetcode上有原体
|
j**j 发帖数: 4 | 19 :) 产生的方法可以这样,是个loop:
0
3 + 0
5 + 0
30 + 3 + 0
30 + 5 + 0
50 + 3 + 0
50 + 5 + 0
...
loop level by level. |
g******3 发帖数: 73 | 20 这个数据是这样的格式
3 5
33 35 53 55
333 335 353 533 555
...
当前层的数据是由上一层的数据产生,所以我用了一个queue来存放上一层的数据,然
后pop queue里面的数据来拼接
vector getCollect(int n){ //n is the length of the input
vector result;
queue que;
que.push(3);
que.push(5);
for(int i = 0; i < n-1;i++){
int sz = que.size();
for(int j = 0; j < sz; j++){
int num = que.front();
que.pop();
que.push(num*10 + 3);
que.push(num*10 + 5);
}
}
int lastNum = que.front();
que.push(lastNum*10 + 3);
while(!que.empty()){
result.push_back(que.front());
que.pop();
}
return result;
} |
d*******m 发帖数: 211 | 21 我不是码工,出于兴趣,最近在学点python。什么 java, C++,还完全不懂。
看了这个帖子,感觉有点思路,但上面几个回帖几乎看不懂。我写了点代码,好像结果
也是对的。想麻烦各位专家给看看我python的代码。
基本思路是先把整数变成字符串列表,再建一个新列表,然后从右往左比较,比较结束
后再把数列变成整数输出。
这样做有没有什么问题?
import copy
def dct(number):
listNumber = list(str(number))
output = copy.copy(listNumber)
for i in range(len(listNumber)-1,-1,-1):
if int(listNumber[i]) == 3 or int(listNumber[i]) == 5:
output[i] = int(listNumber[i])
else:
for l in range(i,len(listNumber)):
output[l] = 3
if int(listNumber[i]) > 5:
listNumber[i-1] = int(listNumber[i-1]) + 1
elif int(listNumber[i]) == 4:
output[i] = 5
if int(listNumber[0]) > 5:
output.insert(0,3)
outputNumber = 0
for i in range(len(output)):
outputNumber = outputNumber * 10 + output[i]
return outputNumber |
m****n 发帖数: 10 | 22 上班时候看到的,断断续续想了小半天,结果花了二十几分钟才写好测好。
unsigned transform(unsigned ori)
{
unsigned temp = ori;
unsigned transformed = 0;
unsigned power = 1;
int carry = 1; //make sure the transformed number is strictly larger
while (temp) {
int dig = temp%10;
if (dig+carry<3) {
transformed = 3*power+(power-1)/3;
//tranform lower to all '3'
carry = 0;
} else if (dig+carry<5&&dig+carry>3) {
transformed = 5*power+(power-1)/3;
//tranform lower to all '3'
carry = 0;
} else if (dig+carry >5) {
transformed = 3*power+(power-1)/3;
carry = 1;
} else {
transformed += (dig+carry)*power;
carry = 0;
}
temp /= 10;
power *= 10;
}
if (carry) {
transformed = 3*power+(power-1)/3;
}
return transformed;
} |