A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

考官说了一下题目:
输出文件中匹配条件的本行,本行的前两行和后两行。
听完题目觉得很简单。但做出来以后,考官来检查的时候发现很多问题。
举个例子,
  • 有连续两行时候的输出。比如3和4符合条件,那么要输出1 2 3 4 5 和2 3 4 5 6
  • 考虑临界条件,比如文件中只有两行的情况。
  • 不能整个文件读入,即可以使用5个单位左右的内存,代码要尽可能复用。

解题关键仅供参考:
1.递归判断,由于第三行满足条件后,要把第五行读完才能输出,所以采用了5个列表,分别含有5,4,3,2,1个元素,要求维护最新数据,节约内存空间。队列最后元素为刚刚读出的数据行。
2.注意处理仅有0,1,2,3,4行的文件的情况。

  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;

  4. namespace GiveMeFive
  5. {
  6.     class MainClass
  7.     {
  8.         public static void Main (string[] args)
  9.         {
  10.             FileStream ftm = new FileStream("data.txt", FileMode.OpenOrCreate, FileAccess.Read);
  11.             StreamReader sr = new StreamReader (ftm);
  12.             List<List<string>> list = new List<List<string>> ();
  13.             GiveMeFive (sr, list);
  14.         }

  15.         static void GiveMeFive(StreamReader sr,List<List<String>> list)
  16.         {
  17.             string str = null;
  18.             if ((str = sr.ReadLine ()) == null) {
  19.                 if(list.Count==0)
  20.                     return;
  21.                 // when the files contain only 1,2,3 lines,
  22.                 if(list.Count<4)
  23.                 {
  24.                     for (int i = 0; i < list[0].Count; i++) {
  25.                         //when file has 3 lines, first element should not be processed.
  26.                         if(list[0].Count==3&&i==0)
  27.                             continue;
  28.                         if(list[0][i].Contains("xyz"))
  29.                            list[0].ForEach(Console.WriteLine);
  30.                     }
  31.                 }
  32.                 // 4,5 lines file: last 1 or last but one line match
  33.                 if(list.Count>3)
  34.                 {
  35.                     for (int i = 0; i < list.Count-2; i++) {
  36.                         // if there are 5 lists, the first elements should not be processed during disposing
  37.                         if(list.Count==5&&i==0)
  38.                             continue;
  39.                         if(list[i][2].Contains("xyz"))
  40.                             list[i].ForEach(Console.WriteLine);
  41.                     }
  42.                 }
  43.                 return;
  44.             }
  45.             // maintains 5 list contains 5,4,3,2,1 element(s) in each list
  46.             if (list.Count < 5) {
  47.                 list.Add(new List<string>());
  48.             }
  49.             // append new element to lists and pop first element when the size is larger than 5,4,3,2,1 each.
  50.             for (int i = 0; i < list.Count; i++) {
  51.                 list[i].Add(str);
  52.                 if(i+list[i].Count>5)
  53.                     list[i].RemoveAt(0);
  54.             }
  55.             //Cover first line and second line match case, and normal case that output five lines.
  56.             if(list.Count>2 && list[0][list[0].Count-3].Contains("xyz"))
  57.                 list[0].ForEach(Console.WriteLine);
  58.          
  59.             GiveMeFive (sr, list);
  60.         }
  61.     }
  62. }
复制代码



1 个回复

倒序浏览
好吧,这个貌似很难呀
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马