12
返回列表 发新帖
楼主: 匿名
跳转到指定楼层
上一主题 下一主题
收起左侧

非死不可 一面

🔗
tkft 2018-11-2 10:08:19 | 只看该作者
全局:
求问这个题,是只通过write想buffer中写数据吗?和read4没有关系对吗?多谢
回复

使用道具 举报

🔗
yiyiyaya 2018-11-9 09:48:32 | 只看该作者
全局:
如果没有read4(),这题直接拿size为k 的queue做就可以了把
回复

使用道具 举报

🔗
jhzhou 2018-11-12 05:48:57 | 只看该作者
全局:
  1. /Users/zhoujiahui/IdeaProjects/untitled/src/ReadOrWriteN.java
复制代码
回复

使用道具 举报

🔗
jhzhou 2018-11-12 05:49:30 | 只看该作者
全局:
  1. import java.util.Arrays;

  2. public class ReadOrWriteN {
  3.     public static void main (String[] args) {
  4.         ReadOrWriteN solution = new ReadOrWriteN(5);
  5.         solution.unitTest();
  6.         return;

  7.     }


  8.     private void unitTest () {
  9.     //
  10.     //        write api 返回的是能够写进buffer的字符串的长度
  11.     //
  12.     //        面试官给的example是这样的:
  13.     //        n=5,n代表buffer的长度
  14.     //                [. . . . .]
  15.     //        write([abc]) =>3
  16.     //                [a b c . .]
  17.     //        write([def]) =>2 // 因为buffer满了,所以只能写进两个char
  18.     //                [a b c d e]
  19.     //        read(3)=>[a b c] / 3
  20.     //                [. . . d e]
  21.     //        write([xyzabc]) => 3
  22.     //                [x y z d e] . Waral 博客有更多文章,
  23.     //        read(8)==>[d e x y z]  // 注意这个地方d e 先读出来是因为这两个是先被write进去的, 有先后关系.留学论坛-一亩-三分地
  24.     //
  25.     //# corner case: [. a b . .]
  26.         char[] temp =  new char[10];
  27.         write("abc".toCharArray());
  28.         write("def".toCharArray());
  29.         read(3, temp);
  30.         write("xyzabc".toCharArray());
  31.         read(8, temp);


  32.     }


  33.     private char[] buffer;
  34.     private int writePt;
  35.     private int readPt;
  36.     private int size;
  37.     private int count;

  38.     ReadOrWriteN (int size){
  39.         this.size = size;
  40.         this.count = 0;
  41.         this.writePt = 0;
  42.         this.readPt = 0;
  43.         this.buffer = new char[size];
  44.     }

  45.     private int read(int n, char[] temp) {
  46.         int res = n > count ? count : n;
  47.         for (int k = 0; k < res; k++) {
  48.             temp[k] = buffer[readPt];
  49.             readPt = (readPt + 1) % size;
  50.         }

  51.         readDebug(temp);

  52.         count -= res;
  53.         return res;
  54.     }

  55.     private void readDebug(char[] temp) {
  56.         System.out.println("-Read!!!!!");
  57.         for (char c : temp) {
  58.             System.out.print(" " + String.valueOf(c));
  59.         }
  60.         System.out.println("");
  61.     }

  62.     private int write(char[] input) {
  63.         int inputSize = input.length;
  64.         int res = inputSize > size - count ? size - count : inputSize;
  65.         for (int k = 0; k < res; k++) {
  66.             buffer[writePt] = input[k];
  67.             writePt = (writePt + 1) % size;
  68.         }

  69.         writeDebug();

  70.         count += res;
  71.         return res;
  72.     }

  73.     private void writeDebug() {
  74.         System.out.println("-Write!!!!!");
  75.         for (char c : buffer) {
  76.             System.out.print(" " + String.valueOf(c));
  77.         }
  78.         System.out.println("");
  79.     }
  80. }
复制代码
回复

使用道具 举报

🔗
zjd005 2018-11-21 02:13:08 | 只看该作者
全局:
求问楼主 # corner case: [. a b . .] 这种情况write 应该写在b 后面还是a前面
回复

使用道具 举报

🔗
TinaTinaTina96 2018-12-25 09:40:09 | 只看该作者
全局:
感觉这道题跟158的关系不大, 我也写了一下代码. 如果有错, 希望小伙伴们指正.
  1. public class ReadWrite {
  2.     char[] buf;
  3.     int size, cap, readPtr, writePtr;

  4.     public ReadWrite(int n) {
  5.         buf = new char[n];
  6.         size = n;
  7.         cap = 0;
  8.         readPtr = 0;
  9.         writePtr = 0;
  10.     }

  11.     public char[] read(int cnt) {
  12.         List<Character> res = new ArrayList<>();
  13.         while (res.size() < cnt && res.size() < cap) {
  14.             res.add(buf[readPtr]);
  15.             buf[readPtr] = '\u0000';
  16.             readPtr = (readPtr + 1) % size;
  17.         }
  18.         cap -= res.size();

  19.         char[] ress = new char[res.size()];
  20.         for (int i = 0; i < res.size(); i++) {
  21.             ress[i] = res.get(i);
  22.         }
  23.         return ress;
  24.     }

  25.     public int write(char[] input) {
  26.         int i = 0;
  27.         while (i < size - cap && i < input.length) {
  28.             buf[writePtr] = input[i++];
  29.             writePtr = (writePtr + 1) % size;
  30.         }
  31.         cap += i;
  32.         return i;
  33.     }


  34.     public static void main(String[] args) {
  35.         ReadWrite rw = new ReadWrite(5);
  36.         int wRes = rw.write("abc".toCharArray());
  37.         wTest(rw, wRes);

  38.         wRes = rw.write("def".toCharArray());
  39.         wTest(rw, wRes);

  40.         char[] rRes = rw.read(3);
  41.         rTest(rw, rRes);

  42.         wRes = rw.write("xyzabc".toCharArray());
  43.         wTest(rw, wRes);

  44.         rRes = rw.read(8);
  45.         rTest(rw, rRes);
  46.     }

  47.     private static void rTest(ReadWrite rw, char[] rRes) {
  48.         System.out.print("rRes: ");
  49.         for (int i = 0; i < rRes.length; i++) {
  50.             System.out.print(rRes[i]);
  51.         }
  52.         System.out.println();

  53.         System.out.print("buf: ");
  54.         for (int i = 0; i < 5; i++) {
  55.             System.out.print(" " + rw.buf[i]);
  56.         }
  57.         System.out.println();
  58.     }

  59.     private static void wTest(ReadWrite rw, int wRes) {
  60.         System.out.println("wRes: " + wRes);
  61.         System.out.print("buf: ");
  62.         for (int i = 0; i < 5; i++) {
  63.             System.out.print(" " + rw.buf[i]);
  64.         }
  65.         System.out.println();
  66.     }
  67. }
复制代码

补充内容 (2018-12-25 09:46):
size: buf的大小, cap: buf里实际元素的个数
回复

使用道具 举报

🔗
YYYAOOO 2019-3-30 15:37:51 | 只看该作者
全局:
这个题可以用一个queue 写吗?
回复

使用道具 举报

🔗
buck_zzy 2019-4-4 07:17:22 | 只看该作者
全局:
python的话 deque就可以,不用circular buffer track读写位置
请问lz,是面试官要求必须circular buffer/array 来做吗?
回复

使用道具 举报

全局:
buck_zzy 发表于 2019-4-4 07:17
python的话 deque就可以,不用circular buffer track读写位置
请问lz,是面试官要求必须circular buffer/a ...

没有明白题意,不知道楼主提到的corner case [.ab..]是怎么产生的。
层主的意思是不是read的时候就用deque popleft?这样的话,是不是不会产生这个corner case?
谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表