Redian新闻
>
来说说P&G 25返10 rebate form吧?
avatar
来说说P&G 25返10 rebate form吧?# PennySaver - 省钱一族
w*g
1
按行倒序输出文件。例如一个文件如下:
abc
123
def
那么输出:
def
123
abc
我说先给个naive的方法一会再改进,建个vector,把每一行写到这个vector
里,然后倒序输出这个vector。他问有什么缺点,我说处理不了大文件,他就叫我改进
。他给了我三个函数:
void seek(int location):文件指针指向第location个字符,如果seek(-1)那么文件
指针指向end of file。
int tell():返回文件指针当前指向哪个字符
string read(bytes):每次读bytes个字符,返回这些字符组成的string,然后文件指
针向后移动一个字符。比如本来文件指针指向第10个字符,那么read(1)就返回第10个
字符组成的字符串,并且文件指针指向第11个字符。
他让我用这三个函数写倒序输出。写着写着我就逻辑混乱了。其实这题很简单,没有算
法很严,就是考察思路是不是严谨。但是我确实写写就乱了。。。我感觉其实面试时考
察这么繁琐的题目是最难的。
avatar
a*t
2
估计排不到merelley同学的form了。
找到form的同学能不能来说说,哪些店拿到的?一般放在什么位置?
kroger有么?thanks
avatar
u*o
3
LZ别难过,这题不像看起来这么简单的,别的CANDIDATES也不一定答的比你好。。。
avatar
y*2
4
ding......
avatar
s*r
5
T家就喜欢问这种繁琐的编程问题,看着很简单,写起来很烦
avatar
M*8
6
我当时找这个form查的的信息
Weis
Karn quality food
raibow food
Ingles
Kmart据说也有
不过我这里这些店都没有。。

【在 a****t 的大作中提到】
: 估计排不到merelley同学的form了。
: 找到form的同学能不能来说说,哪些店拿到的?一般放在什么位置?
: kroger有么?thanks

avatar
c*m
7
这题每行的字符数一样吗?不一样的话挺不好写啊
avatar
f*w
8
如果kroger也有就不会这么hot了
avatar
w*g
9
我写完就找到了几个bug,我说还会有别的bug,他说正常,这道题不可能over phone写
出没bug的

【在 s*****r 的大作中提到】
: T家就喜欢问这种繁琐的编程问题,看着很简单,写起来很烦
avatar
q*u
10
同好奇,到底那些店那些地方有这个form呢?挺神秘的。
avatar
u*o
11
LZ愿意分享一下你的CODE吗?我觉得我脑子比你还乱,自己在纸上写了写,已经放弃了
。。如果每行字符不一样的话,好麻烦的啊。。。
avatar
h*p
12
谁能代理这个rebate form,想要又找不到阿。

【在 a****t 的大作中提到】
: 估计排不到merelley同学的form了。
: 找到form的同学能不能来说说,哪些店拿到的?一般放在什么位置?
: kroger有么?thanks

avatar
r*n
13
他的意思是
ifstream in("file.name", ios::binary|ios::in|ios::ate);
然后in的streampos指向文件末尾,你可以定义一个int stepsize,然后
in.seekg(-stepsize, ios::cur)
in.read(char_array, stepsize),然后再去parse char_array,用"\n"作为delimiter
。当然你可能把一个word拆开成两半,所以还要handle一下这种边界情况。
avatar
x*l
14
KMART有很多的,上上周我看到了,但是没拿,
avatar
h*i
15
此题还好,先读到文件的长度,然后就挨行读,每行你都能计算到要写的初始位置,seek到
那儿,再写就行了.只需要一个变量来累加读了多少byte就行了.

【在 s*****r 的大作中提到】
: T家就喜欢问这种繁琐的编程问题,看着很简单,写起来很烦
avatar
r*e
16
我觉得你的想法不错,但是不一定能行得通,因为你怎么挨行读呢?
如果你能一行一行地读的话,还累计byte干什么?直接倒着边读边写
不就成了?

【在 h***i 的大作中提到】
: 此题还好,先读到文件的长度,然后就挨行读,每行你都能计算到要写的初始位置,seek到
: 那儿,再写就行了.只需要一个变量来累加读了多少byte就行了.

avatar
h*i
17
累计byte多少是计算seek位置用的.

【在 r*****e 的大作中提到】
: 我觉得你的想法不错,但是不一定能行得通,因为你怎么挨行读呢?
: 如果你能一行一行地读的话,还累计byte干什么?直接倒着边读边写
: 不就成了?

avatar
r*e
18
和EPI中给出的打印文件最后K行相似,那里给的解法是一个一个字符读取,当然是
从文件末尾开始,读到'n'为一行,读的字符放到string里,没到一行reverse一下
string。我当时写过这个程序,贴一下相关部分吧:
我没有对这道题做修改,其实改动也容易。
fptr.seekg(0, fptr.end);//need to go the end first for tellg to return
the correct size of file
int sz = fptr.tellg();

int cnt=0;
for (int i=0; ifptr.seekg(-1-i, ios::end);
char c = fptr.get();
if (c=='n') {
++cnt;
if (cnt>k) break;
}
lines.push_back(c);
}
reverse(lines.begin(), lines.end());
return lines;

vector

【在 w********g 的大作中提到】
: 按行倒序输出文件。例如一个文件如下:
: abc
: 123
: def
: 那么输出:
: def
: 123
: abc
: 我说先给个naive的方法一会再改进,建个vector,把每一行写到这个vector
: 里,然后倒序输出这个vector。他问有什么缺点,我说处理不了大文件,他就叫我改进

avatar
r*h
19
直接从磁盘里一个个seek+read会不会比较慢?按照上面某楼的说法用一个buf应该比较
好吧

【在 r*****e 的大作中提到】
: 和EPI中给出的打印文件最后K行相似,那里给的解法是一个一个字符读取,当然是
: 从文件末尾开始,读到'n'为一行,读的字符放到string里,没到一行reverse一下
: string。我当时写过这个程序,贴一下相关部分吧:
: 我没有对这道题做修改,其实改动也容易。
: fptr.seekg(0, fptr.end);//need to go the end first for tellg to return
: the correct size of file
: int sz = fptr.tellg();
:
: int cnt=0;
: for (int i=0; i
avatar
r*e
20
我主要是不知道怎么逐行seek,或者说怎么决定seek的size。
如果可以逐行seek的话,那就一行一行打印就好了,也太容易了。
也就是说,怎么能迅速找到一行的起始点?
对换行符的判断是必须的吧?那样就只能一个一个读了,虽然我也
想能一次多读点。

【在 r**h 的大作中提到】
: 直接从磁盘里一个个seek+read会不会比较慢?按照上面某楼的说法用一个buf应该比较
: 好吧

avatar
h*i
21
seek不慢, read也是按block cache到memory里的(不用操心, OS自动的),要想加速,可
以用mmap.

【在 r**h 的大作中提到】
: 直接从磁盘里一个个seek+read会不会比较慢?按照上面某楼的说法用一个buf应该比较
: 好吧

avatar
G*7
22
it's a trap! you just lost minutes for the next problem and points for cli.
you should just tell him to "tac theFileToBeReversed".
here is how it's done.
http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/tac.c

vector

【在 w********g 的大作中提到】
: 按行倒序输出文件。例如一个文件如下:
: abc
: 123
: def
: 那么输出:
: def
: 123
: abc
: 我说先给个naive的方法一会再改进,建个vector,把每一行写到这个vector
: 里,然后倒序输出这个vector。他问有什么缺点,我说处理不了大文件,他就叫我改进

avatar
g*o
23
这题是不是常考的一道智力题?
2、 用线性时间和常数附加空间将一篇文章的单词(不是字符)倒序。
答案:先将整篇文章的所有字符逆序(从两头起不断交换位置相对称的字符);然
后用同样的办法将每个单词内部的字符逆序。这样,整篇文章的单词顺序颠倒了,但单
词本身又被转回来了。
可以在o(n)时间内原地实现
具体来说
abc
123
def
先将整篇文章的所有字符逆序
fed
321
cba
然后用同样的办法将每个单词内部的字符逆序
def
123
abc
就完成了

vector

【在 w********g 的大作中提到】
: 按行倒序输出文件。例如一个文件如下:
: abc
: 123
: def
: 那么输出:
: def
: 123
: abc
: 我说先给个naive的方法一会再改进,建个vector,把每一行写到这个vector
: 里,然后倒序输出这个vector。他问有什么缺点,我说处理不了大文件,他就叫我改进

avatar
B*t
24
这题是RF家出的实现tail -n and -f option的简单版本。。。。。
avatar
p*2
25

delimiter
这个跟我想的差不多。

【在 r*********n 的大作中提到】
: 他的意思是
: ifstream in("file.name", ios::binary|ios::in|ios::ate);
: 然后in的streampos指向文件末尾,你可以定义一个int stepsize,然后
: in.seekg(-stepsize, ios::cur)
: in.read(char_array, stepsize),然后再去parse char_array,用"\n"作为delimiter
: 。当然你可能把一个word拆开成两半,所以还要handle一下这种边界情况。

avatar
p*2
26

貌似memory 可能不够。

【在 g****o 的大作中提到】
: 这题是不是常考的一道智力题?
: 2、 用线性时间和常数附加空间将一篇文章的单词(不是字符)倒序。
: 答案:先将整篇文章的所有字符逆序(从两头起不断交换位置相对称的字符);然
: 后用同样的办法将每个单词内部的字符逆序。这样,整篇文章的单词顺序颠倒了,但单
: 词本身又被转回来了。
: 可以在o(n)时间内原地实现
: 具体来说
: abc
: 123
: def

avatar
s*e
27
这个编程珠玑上有谈过类似的情况

【在 p*****2 的大作中提到】
:
: 貌似memory 可能不够。

avatar
p*2
28

上边怎么解决的呀?

【在 s***e 的大作中提到】
: 这个编程珠玑上有谈过类似的情况
avatar
s*e
29
和你的方法类似
编程珠矶的问题是
已知abcdefgh
要求变成defghabc
做法是先逆序成hgfedcba
然后分段逆序。
见英文版programming pearls pp 15

【在 p*****2 的大作中提到】
:
: 上边怎么解决的呀?

avatar
f*e
30
在内存中可以reverse,在文件中代价是不是太大了
avatar
s*e
31
还有一个比较烂的方法
将文件倒着用fseek和fread一个byte一个byte的读到buffer里面
读到\n或者文件头的时候就输出buffer
avatar
q*c
32
先把文件顺序读一遍,记下所有行号起始位置。
第二遍从末尾seek.
这样不行?

【在 w********g 的大作中提到】
: 按行倒序输出文件。例如一个文件如下:
: abc
: 123
: def
: 那么输出:
: def
: 123
: abc
: 我说先给个naive的方法一会再改进,建个vector,把每一行写到这个vector
: 里,然后倒序输出这个vector。他问有什么缺点,我说处理不了大文件,他就叫我改进

avatar
r*h
33
可以啊,不过要是文件非常非常大以至于行号在内存里面都放不下呢?

【在 q*c 的大作中提到】
: 先把文件顺序读一遍,记下所有行号起始位置。
: 第二遍从末尾seek.
: 这样不行?

avatar
M*g
34
为啥不用stack啊?

vector

【在 w********g 的大作中提到】
: 按行倒序输出文件。例如一个文件如下:
: abc
: 123
: def
: 那么输出:
: def
: 123
: abc
: 我说先给个naive的方法一会再改进,建个vector,把每一行写到这个vector
: 里,然后倒序输出这个vector。他问有什么缺点,我说处理不了大文件,他就叫我改进

avatar
l*b
35
这个可能吗?如果是AMD64的machine?

【在 r**h 的大作中提到】
: 可以啊,不过要是文件非常非常大以至于行号在内存里面都放不下呢?
avatar
r*e
36
ext4/NTFS的单个文件最大size是16TB
每行一个字符的话,行号肯定放不进内存哈

【在 l**b 的大作中提到】
: 这个可能吗?如果是AMD64的machine?
avatar
l*b
37
切,老年痴呆,想成最大行号了。。。

【在 r*******e 的大作中提到】
: ext4/NTFS的单个文件最大size是16TB
: 每行一个字符的话,行号肯定放不进内存哈

avatar
q*c
38
哪文件得大成啥样子。
就算那样, 也可以分段进行。
filesize/maxMemorySize = n.
seek to last slot of n, do it, then next...

【在 r**h 的大作中提到】
: 可以啊,不过要是文件非常非常大以至于行号在内存里面都放不下呢?
avatar
t*i
39
两个指针加一个buffer就足够了。不会内存不够的。

【在 p*****2 的大作中提到】
:
: 上边怎么解决的呀?

avatar
p*2
40

你说的是先逆序再逆序的办法?

【在 t******i 的大作中提到】
: 两个指针加一个buffer就足够了。不会内存不够的。
avatar
p*2
41

没看到有说memory不够的情况呀。

【在 p*****2 的大作中提到】
:
: 你说的是先逆序再逆序的办法?

avatar
y*c
42
same idea here.
Seek(n) take log n?

【在 q*c 的大作中提到】
: 哪文件得大成啥样子。
: 就算那样, 也可以分段进行。
: filesize/maxMemorySize = n.
: seek to last slot of n, do it, then next...

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。