由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - G电面一题
相关主题
问一个facebook的电面一道面试题和解法(求指点).
leetcode的Text Justification的OJ关于leetcode的combinationSum题
问下LeetCode上的题目:count and say请教个面试题
reverse words in a stringGOOG intern interview 题目
Google 电面请教一道面试题
讨论下lc最新的那道hard题吧【一个BB公司问的字母排序的问题】
50行code能解决addbinary 问题么G电面题 + 求祝福
星期一福利:某公司店面题一道电面题,分享下, 这个题应该用哪几个data structure?
相关话题的讨论汇总
话题: arraylist话题: string话题: char话题: int
进入JobHunting版参与讨论
1 (共1页)
D***n
发帖数: 149
1
给一个 数字串, 比如 12259 , map到 char数组 或者 String. 1 -> a 2-> b,
... 12 -> l ... 26-> z.
12259 -> lyi : abbei : lbei : abyi
输入一个数字串,判断是否能转换成 String,如果能,则打印所以有可能的string.
f*****e
发帖数: 2992
2
总可以转成子串啊?都取1位数,否则DP。

【在 D***n 的大作中提到】
: 给一个 数字串, 比如 12259 , map到 char数组 或者 String. 1 -> a 2-> b,
: ... 12 -> l ... 26-> z.
: 12259 -> lyi : abbei : lbei : abyi
: 输入一个数字串,判断是否能转换成 String,如果能,则打印所以有可能的string.

D***n
发帖数: 149
3
30 就不行。。。 0之前的数字必须是 1 or 2. 10-> j 20 -> t.
必须打印所有可能的映射。
w****x
发帖数: 2483
4
F家的题吧, 如果只算多少种组合的话O(1)空间的DP, 要打印就用递归了
f*****e
发帖数: 2992
5
那先把0找出来,和前面的digit配对,配不了对的就不是,这些x0's把整个string分成
几个
substring,然后对substringDP。

【在 D***n 的大作中提到】
: 30 就不行。。。 0之前的数字必须是 1 or 2. 10-> j 20 -> t.
: 必须打印所有可能的映射。

z******e
发帖数: 82
6
public class Test {
public static void main(String[] args) {
test("12023456", "", 0);
}
public static void test(String nums, String out, int start) {
if (nums == null || start == nums.length()) {
System.out.println(out);
return;
}
int i = nums.charAt(start) - '0';
if (i != 0) {
test(nums, out + (char) (i + 64), start + 1);
if (start + 1 < nums.length()) {
i = Integer.parseInt(nums.substring(start, start + 2));
if (i <= 26) {
test(nums, out + (char) (i + 64), start + 2);
}
}
}
}
}
Output:
-----------------
ATBCDEF
ATWDEF
N**n
发帖数: 832
7
给你个反例,90,你给我转个字符串看看

【在 f*****e 的大作中提到】
: 总可以转成子串啊?都取1位数,否则DP。
g*******n
发帖数: 214
8
如果不用recursion的话代码太长是不是面试的时候不能用?
public ArrayList numString2Char(String num) {
//map to store all the previous possibilities
HashMap> map = new HashMap ArrayList>();
int[] numbers = new int[num.length()];
for (int i = 0; i < num.length(); i++) {
numbers[i] = Integer.parseInt(num.charAt(i) + "");
}
if(numbers[0]==0) return null;
ArrayList tempList;
StringBuffer sb;

for(Integer i=0;i ArrayList last = map.get(i-1);
// number is in 1 - 9
if(numbers[i]>0&&numbers[i]<=9){
if(last==null){
tempList= new ArrayList();
sb = new StringBuffer().append((char)('a'-1+numbers[i]));
tempList.add(sb);
map.put(i,tempList);
}
else{
tempList = map.get(i);
if(tempList==null){
tempList = new ArrayList();
for(StringBuffer tempSb:last){
sb = new StringBuffer().append(tempSb).append((
char)('a'-1+numbers[i]));
tempList.add(sb);
}
map.put(i,tempList);
}
else{
for(StringBuffer tempSb:last){
sb = new StringBuffer().append(tempSb).append((
char)('a'-1+numbers[i]));
tempList.add(sb);
}
map.put(i,tempList);
}
}
}
if(i==0) continue;
// list of i-2
ArrayList last2 = map.get(i-2);
//cannot parse
if(numbers[i]==0&&(numbers[i-1]!=1&&numbers[i-1]!=2))
return null;

int number = numbers[i-1]*10+numbers[i];
if(number<1 || number>26) continue;
// test if a 2-number digit is ok
if(last2==null){
ArrayList temp = map.get(i);
if(temp==null)
temp = new ArrayList();
StringBuffer tempSb = new StringBuffer().append((char)('a'-1
+number));
temp.add(tempSb);
map.put(i,temp);
}
else{
ArrayList temp = map.get(i);
if(temp==null)
temp = new ArrayList();
for(StringBuffer tempSb:last2){
sb = new StringBuffer().append(tempSb).append((char)('a'
-1+number));
temp.add(sb);
}
map.put(i,temp);
}
}
ArrayList result = new ArrayList();
for (StringBuffer tempSb : map.get(numbers.length - 1)) {
result.add(tempSb.toString());
}
return result;
}
p****n
发帖数: 294
9
随便写了一下, 用递归
String maps = "abcdefghijklmnopqrstuvwxyz";
public ConvertNumberToString(int num) {
String numStr = String.valueOf(num);
if (false == getCombination(numStr, "")) {
System.out.println("NO");
}
}
private boolean getCombination(String remain, String result) {
if (remain.length() == 0) {
System.out.println(result);
return true;
}
int n = Integer.parseInt(remain.substring(0, 1)) - 1;
if (n < 0){
return false;
}
char ch = maps.charAt(n);
boolean one = getCombination(remain.substring(1), result + ch);
boolean two = false;
if (remain.length() >= 2) {
n = Integer.parseInt(remain.substring(0, 2)) - 1;
if (n > 26) {
return false;
}
ch = maps.charAt(n);
two = getCombination(remain.substring(2), result + ch);
}
return one || two;
}
C*******n
发帖数: 49
10
正解

【在 w****x 的大作中提到】
: F家的题吧, 如果只算多少种组合的话O(1)空间的DP, 要打印就用递归了
t****a
发帖数: 1212
11
; quick clojure solution: dp with memoize function.
(use 'clojure.string)
;; define the map
(def alphabet (map #(str (char %)) (range 97 123)))
(def number (map #(str (inc %)) (range 26)))
(def n2a (apply assoc {} (interleave number alphabet)))
;; implement dp with memoize function
(def number-translate (memoize (fn [long]
(cond (blank? long) [""]
(= (count long) 1) (if (contains? n2a long)
[(n2a long)]
[])
:else (let [len (count long)
last1 (subs long (dec len))
last2 (subs long (- len 2) len)
rest1 (subs long 0 (dec len))
rest2 (subs long 0 (- len 2))
a1 (n2a last1)
a2 (n2a last2)
o1 (number-translate rest1)
o2 (number-translate rest2)
n1 (if (nil? a1)
[]
(map #(str % a1) o1))
n2 (if (nil? a2)
[]
(map #(str % a2) o2))
n (concat n1 n2)]
n)))))
(number-translate "12259") ; ("abbei" "lbei" "avei" "abyi" "lyi")

【在 D***n 的大作中提到】
: 给一个 数字串, 比如 12259 , map到 char数组 或者 String. 1 -> a 2-> b,
: ... 12 -> l ... 26-> z.
: 12259 -> lyi : abbei : lbei : abyi
: 输入一个数字串,判断是否能转换成 String,如果能,则打印所以有可能的string.

t****a
发帖数: 1212
12
Really? I think DP can also do print job.

【在 w****x 的大作中提到】
: F家的题吧, 如果只算多少种组合的话O(1)空间的DP, 要打印就用递归了
w***o
发帖数: 109
13
我来试试,只有递归,没有DP,可以加HashMap来记住阶段性成果。只返回多少种可能。
int count(int n) {
if (n == 0)
return 0;
if (n <= 10 || n == 20)
return 1;
if (n <= 26)
return 2;

int ret = 0;
int m = n % 10;
if (m != 0)
ret += count(n / 10);
m = n % 100;
if (m >= 10 && m <= 26)
ret += count(n / 100);

return ret;
}
a******a
发帖数: 2646
14
请指教。我的解答
#include "stdafx.h"
#include
using namespace std;
void transform(char* ,char* ,int ,int,int );
int _tmain(int argc, _TCHAR* argv[])
{

char b[100];
char a[100];
cin.getline(a,100);
int length;
for( length=0;length<100;length++)
if(a[length]=='\0')
break;
transform( a, b, length,0,0);
return 0;
}
void transform(char* a,char* b,int length,int loca,int locb)
{
char x,y[2];
x=*(a+loca);
*(b+locb)=static_cast(atoi(&x)+97);
if (loca==(length -1))
{*(b+locb+1)='\0';
cout < return;
}
else if(loca<(length -1))
transform(a,b,length,loca+1,locb+1);
y[0]=*(a+loca);
y[1]=*(a+loca+1);
if(atoi(y)<26)
{
*(b+locb)=static_cast(atoi(y)+97);
if (loca==(length -2))
{
*(b+locb+1)='\0';
cout < return;
}
else if(loca<(length -2))
transform(a,b,length,loca+2,locb+1);
}
}
1 (共1页)
进入JobHunting版参与讨论
相关主题
一道电面题,分享下, 这个题应该用哪几个data structure?Google 电面
Permutation leetcode-讨论下lc最新的那道hard题吧
今天G家电面的一道题50行code能解决addbinary 问题么
Google 电面星期一福利:某公司店面题
问一个facebook的电面一道面试题和解法(求指点).
leetcode的Text Justification的OJ关于leetcode的combinationSum题
问下LeetCode上的题目:count and say请教个面试题
reverse words in a stringGOOG intern interview 题目
相关话题的讨论汇总
话题: arraylist话题: string话题: char话题: int