今天去北京某公司面试一个Android的sdk开发工程师,到达公司后直接商家根据需求完成相应的编码工作,20分钟写不出来没有面试机会,结果不出意外的我没有完全写出来,被pass掉,内心虽然有些失落,但是一想,毕竟这个岗位薪资是是相对可观的,没有那么容易。也就释然了,在回来的路上才想到了如何写出来这个,欲哭无泪啊,于是想起一句话:机会随时都有,就看你准备好了没。下面是我回到房子后重新写的那个面试题,编写完成,测试没毛病:
要求:
1. 采用io流读出res文件夹下worlds.file 的文本
2.对文本内容进行压缩输出压缩后的字符串,用Junit来测试
eg:我我我是一个个小小鸟 压缩后的字符串:我3是1一1个2小2鸟1
package main;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Compress {
public String compress() {
StringBuilder result = new StringBuilder();
File file = new File("src/res/words.file");
FileInputStream fis = null;
String content = null;
try {
fis = new FileInputStream(file);
/*
* file.lenth()表示文本内容所占的字节数
*/
// 创建一个与文本长度一直的字节缓冲区
byte[] buf = new byte[(int) file.length()];
System.out.println("文件的字节数:" + file.length());
int i;// 一次读取的字节数
while ((i = fis.read(buf)) != -1) {
content = new String(buf);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fis.close();//关流
} catch (IOException e) {
e.printStackTrace();
}
}
int count = content.length();// 该长度以字符为单位
char c1 = content.charAt(0);// 获取第一个字符
int sum = 1;// 重复的个数
for (int j = 1; j < count; j++) {
char c2 = content.charAt(j);
if (c1 == c2) {
sum++;
continue;
}
result.append(c1).append(sum);
sum = 1;
c1 = c2;
}
result.append(c1).append(sum);// 将最后一个添加上
System.out.println(result.toString());
return result.toString();
}
}
测试代码如下:
package main;
import static org.junit.Assert.*;
import java.io.IOException;
import org.junit.Test;
public class CompressTest {
@Test
public void test() throws Exception {
Compress compress = new Compress();
try {
String reString = compress.compress();
if (!reString.equals("我3哦1我1是1一1个1小2鸟2a3b3c3")) {
throw new Exception("对不起,测试错误");
} else {
System.out.println("恭喜您,通过上机测试");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
worlds.file的文本内容:我我我哦我是一个小小鸟鸟aaabbbccc