考官说了一下题目:
输出文件中匹配条件的本行,本行的前两行和后两行。
听完题目觉得很简单。但做出来以后,考官来检查的时候发现很多问题。
举个例子,
- 有连续两行时候的输出。比如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行的文件的情况。 - using System;
- using System.IO;
- using System.Collections.Generic;
-
- namespace GiveMeFive
- {
- class MainClass
- {
- public static void Main (string[] args)
- {
- FileStream ftm = new FileStream("data.txt", FileMode.OpenOrCreate, FileAccess.Read);
- StreamReader sr = new StreamReader (ftm);
- List<List<string>> list = new List<List<string>> ();
- GiveMeFive (sr, list);
- }
-
- static void GiveMeFive(StreamReader sr,List<List<String>> list)
- {
- string str = null;
- if ((str = sr.ReadLine ()) == null) {
- if(list.Count==0)
- return;
- // when the files contain only 1,2,3 lines,
- if(list.Count<4)
- {
- for (int i = 0; i < list[0].Count; i++) {
- //when file has 3 lines, first element should not be processed.
- if(list[0].Count==3&&i==0)
- continue;
- if(list[0][i].Contains("xyz"))
- list[0].ForEach(Console.WriteLine);
- }
- }
- // 4,5 lines file: last 1 or last but one line match
- if(list.Count>3)
- {
- for (int i = 0; i < list.Count-2; i++) {
- // if there are 5 lists, the first elements should not be processed during disposing
- if(list.Count==5&&i==0)
- continue;
- if(list[i][2].Contains("xyz"))
- list[i].ForEach(Console.WriteLine);
- }
- }
- return;
- }
- // maintains 5 list contains 5,4,3,2,1 element(s) in each list
- if (list.Count < 5) {
- list.Add(new List<string>());
- }
- // append new element to lists and pop first element when the size is larger than 5,4,3,2,1 each.
- for (int i = 0; i < list.Count; i++) {
- list[i].Add(str);
- if(i+list[i].Count>5)
- list[i].RemoveAt(0);
- }
- //Cover first line and second line match case, and normal case that output five lines.
- if(list.Count>2 && list[0][list[0].Count-3].Contains("xyz"))
- list[0].ForEach(Console.WriteLine);
-
- GiveMeFive (sr, list);
- }
- }
- }
复制代码
|