1
/***********************************************************************************
1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,
a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。
*************************************************************************************/答:packagecom.example;importjava.io.File;importjava.io.FileReader;importjava.io.FileWriter;importjava.net.URLDecoder;public classexample1 {public static void main(String[] args) throwsException {
FileManager m1= new FileManager("a.txt", new char[]{'\n'});
FileManager m2= new FileManager("b.txt", new char[]{'\n', ' '});
FileWriter c= new FileWriter("c.txt");
String aWord= null;
String bWord= null;while((aWord = m1.nextWord()) != null){
c.write(aWord+ "\n");
bWord=m2.nextWord();if(bWord != null){
c.write(bWord+ "\n");
}
}while((bWord = m2.nextWord()) != null){
c.write(bWord+ "\n");
}
c.close();
}
}classFileManager{
String[] words= null;int pos = 0;public FileManager(String filename, char[] seperators) throwsException{//ClassLoader.getSystemResource("")//file:\D:\Coding_Project\eclipse2\Java面试问题集\Chapter2\bin\a.txt//this.getClass().getResource("").getPath()///D:/Coding_Project/eclipse2/Java面试问题集/Chapter2/bin/com/example///System.out.println(URLDecoder.decode(this.getClass().getResource("/").getPath(),"UTF-8"));
filename=this.getClass().getResource("/").getPath() +filename;
filename=URLDecoder.decode(filename,"UTF-8"); //中文路径问题
File f = newFile(filename);
FileReader reader= newFileReader(f);char[] buf = new char[(int)f.length()];int len =reader.read(buf);
String results= new String(buf, 0, len);
String regex= null;if(seperators.length > 1){
regex= "" + seperators[0] + "|" + seperators[1];
}else{
regex= "" + seperators[0];
}
words=results.split(regex);
reader.close();//System.out.println();
}publicString nextWord(){if(pos ==words.length){return null;
}return words[pos++];
}
}
FilenameFilter
一、FilenameFilter介绍
Java.io.FilenameFilter是文件名过滤器,用来过滤不符合规格的文件名,并返回合格的文件;
一般地:
(1)String[] fs =f.list();
(2)File[] fs =f.listFiles();
这两个方法返回f下的所有文件或目录;
FilenameFilter用来把符合要求的文件或目录返回;
因此可以调用:
(1)String []fs =f.list(FilenameFilter filter);;
(2)File[]fs =f.listFiles(FilenameFilter filter);
二、文件名过滤器一般用法1.实现FilenameFilter接口;2.实现boolean accept(File dir,String name); //dir表示文件的当前目录,name表示文件名;
class MyFilter implementsFilenameFilter{private String type; //type为需要过滤的条件,比如如果type=".jpg",则只能返回后缀为jpg的文件
publicMyFilter(String type){this.type =type;
}public boolean accept(File dir,String name){ //返回true的文件则合格
}
}
三、实例
要求:返回当前目录下所有以.java结尾的文件;packageorg.exam5a;importjava.io.File;importjava.io.FilenameFilter;public classT4 {public static void main(String[] args)throwsException {
File f= new File(".");
MyFilter filter= new MyFilter(".java");
String[] files=f.list(filter);for(String a:files){
System.out.println(a);
}
}static class MyFilter implementsFilenameFilter{privateString type;publicMyFilter(String type){this.type =type;
}public booleanaccept(File dir,String name){returnname.endsWith(type);
}
}
}2
/***********************************************************************************
2、编写一个程序,将d:\java 目录下的所有.java 文件复制到d:\temp 目录下,并
将原来文件的扩展名从.java 改为.temp
*************************************************************************************/
packagecom.example;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.FilenameFilter;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;public classexample2 {public static void main(String[] args) throwsException {
java2temp jt= newjava2temp();
jt.transfer();
}
}classjava2temp {//String srcPath = URLDecoder.decode(this.getClass().getResource("/").getPath(),"UTF-8");
public void transfer() throwsException{//System.getProperty("user.dir") + "\\src";//D:\Coding_Project\eclipse2\Java面试问题集\Chapter2\src//String srcPath = URLDecoder.decode(this.getClass().getResource("/").getPath(),"UTF-8");///D:/Coding_Project/eclipse2/Java面试问题集/Chapter2/bin/
String srcPath = System.getProperty("user.dir") + "\\src\\com\\example";
String desPath= srcPath + "\\temp";
System.out.println(srcPath+"\n"+desPath);
File srcDir= newFile(srcPath);if(!(srcDir.exists() &&srcDir.isDirectory())){throw new Exception("directory doesn't exist");
}
File[] files=srcDir.listFiles(newFilenameFilter() {
@Overridepublic booleanaccept(File dir, String name) {//TODO Auto-generated method stub
return name.endsWith(".java");
}
}
);
System.out.println(files.length);
File desDir= newFile(desPath);if(!desDir.exists()){
desDir.mkdirs();
}for(File f : files){
FileInputStream fis= newFileInputStream(f);
String destFilename= f.getName().replaceAll("\\.java$", ".temp");
FileOutputStream fos= new FileOutputStream(newFile(desDir, destFilename));
copy(fis, fos);
fis.close();
fos.close();
}
}private void copy(InputStream ips, OutputStream ops) throwsIOException{int len = 0;byte[] buf = new byte[1024];while((len = ips.read(buf)) != -1){
ops.write(buf,0, len);
}
}
}
不同编码英文字母和中文汉字所占字节。
GBK的编码是一个汉字两个字节,范围是第一个字节大于128开始,第二个字节从大于64开始。
第一个字节大于127就表示这是个汉字的开始。
byte这种类型只有java有,范围是-127到127.所以打印出来转换了就变成负数了。importjava.io.UnsupportedEncodingException;public classEncodeTest {/*** 打印字符串在指定编码下的字节数和编码名称到控制台
*
*@params
* 字符串
*@paramencodingName
* 编码格式*/
public static voidprintByteLength(String s, String encodingName) {
System.out.print("字节数:");try{
System.out.print(s.getBytes(encodingName).length);
}catch(UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println(";编码:" +encodingName);
}public static voidmain(String[] args) {
String en= "A";
String ch= "人";//计算一个英文字母在各种编码下的字节数
System.out.println("英文字母:" +en);
EncodeTest.printByteLength(en,"GB2312");
EncodeTest.printByteLength(en,"GBK");
EncodeTest.printByteLength(en,"GB18030");
EncodeTest.printByteLength(en,"ISO-8859-1");
EncodeTest.printByteLength(en,"UTF-8");
EncodeTest.printByteLength(en,"UTF-16");
EncodeTest.printByteLength(en,"UTF-16BE");
EncodeTest.printByteLength(en,"UTF-16LE");
System.out.println();//计算一个中文汉字在各种编码下的字节数
System.out.println("中文汉字:" +ch);
EncodeTest.printByteLength(ch,"GB2312");
EncodeTest.printByteLength(ch,"GBK");
EncodeTest.printByteLength(ch,"GB18030");
EncodeTest.printByteLength(ch,"ISO-8859-1");
EncodeTest.printByteLength(ch,"UTF-8");
EncodeTest.printByteLength(ch,"UTF-16");
EncodeTest.printByteLength(ch,"UTF-16BE");
EncodeTest.printByteLength(ch,"UTF-16LE");
}
}
运行结果如下:
英文字母:A
字节数:1;编码:GB2312
字节数:1;编码:GBK
字节数:1;编码:GB18030
字节数:1;编码:ISO-8859-1字节数:1;编码:UTF-8字节数:4;编码:UTF-16字节数:2;编码:UTF-16BE
字节数:2;编码:UTF-16LE
中文汉字:人
字节数:2;编码:GB2312
字节数:2;编码:GBK
字节数:2;编码:GB18030
字节数:1;编码:ISO-8859-1字节数:3;编码:UTF-8字节数:4;编码:UTF-16字节数:2;编码:UTF-16BE
字节数:2;编码:UTF-16LE
编码范围//1. GBK (GB2312/GB18030)//x00-xff GBK双字节编码范围//x20-x7f ASCII//xa1-xff 中文//x80-xff 中文//
//2. UTF-8 (Unicode)//u4e00-u9fa5 (中文)//x3130-x318F (韩文)//xAC00-xD7A3 (韩文)//u0800-u4e00 (日文)
3
/***********************************************************************************
3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,
但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,
输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。
*************************************************************************************/
packagecom.example;importjava.io.UnsupportedEncodingException;public classexample3 {public static void main(String[] args) throwsException {
String str= "你abc好";
trimGBK(str,6);
}public static void trimGBK(String str, int n) throwsUnsupportedEncodingException{byte[] buf = str.getBytes("GBK");boolean bChineseFirstHalf = false;int num = 0;//GBK的编码是一个汉字两个字节,范围是第一个字节大于128开始,第二个字节从大于64开始。//第一个字节大于127就表示这是个汉字的开始。//byte这种类型只有java有,范围是-127到127.所以打印出来转换了就变成负数了。//编码范围//1. GBK (GB2312/GB18030)//x00-xff GBK双字节编码范围//x20-x7f ASCII -- 英文为正数//xa1-xff 中文 -- 中文为负数//x80-xff 中文//
//2. UTF-8 (Unicode)//u4e00-u9fa5 (中文)//x3130-x318F (韩文)//xAC00-xD7A3 (韩文)//u0800-u4e00 (日文)
for(int i = 0; i < n; i++){if(buf[i] < 0 && !bChineseFirstHalf){
bChineseFirstHalf= true;
}else{
num++;
bChineseFirstHalf= false;
}
}
System.out.println(str.substring(0, num));
}
}4
/***********************************************************************************
4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。
*************************************************************************************/
packagecom.example;importjava.util.HashMap;importjava.util.Map;public classexample4 {public static void main(String[] args) throwsException {
String str= "中国aadf的111萨bbb菲的zz萨菲";char[] strArr =str.toCharArray();
HashMap map = new HashMap();
Integer num= 0;for(charc : strArr){
num=map.get(c);if(num == null){
num= 1;
}else{
num= num + 1;
}
map.put(c, num);
}for(Map.Entryentry : map.entrySet()){
System.out.println(entry.getKey()+ "\t: " +entry.getValue());
}
}
}//结果
f : 1菲 :2
1 : 3d :1b :3的 :2a :2中 :1萨 :2国 :1z :2
5二叉树/***********************************************************************************
5、说明生活中遇到的二叉树,用java 实现二叉树
答: 二叉查找树
*************************************************************************************/
packagecom.example;importjava.util.Arrays;importjava.util.HashMap;public classexample5 {public static void main(String[] args) throwsException {int[] data = new int[10];
HashMap map = new HashMap<>();for(int i=0; i
tmp= (int)(Math.random() * 100 + 1);
}
data[i]=tmp;
map.put(tmp,true);
}
System.out.println(Arrays.toString(data));
BinaryTree root= new BinaryTree(data[0]);for(inti : data){if(i != data[0]){//System.out.print(i + " ");
root.add(i);
}
}
System.out.println("先序:");
root.preOrderTraverse();
System.out.println();
System.out.println("中序:");
root.midOrderTraverse();
System.out.println();
System.out.println("非递归中序:");
root.midOrderTraverse2();
System.out.println();
System.out.println("后序:");
root.postOrderTraverse();
System.out.println();
}
}classBinaryTree{private intvalue;privateBinaryTree lChild;privateBinaryTree rChild;publicBinaryTree(){
}public BinaryTree(intvalue){this.value =value;
}
@OverridepublicString toString() {//TODO Auto-generated method stub
StringBuilder sb = newStringBuilder();
sb.append(value);returnsb.toString();
}public void add(intvalue){if(value < this.value){if(this.lChild == null){
lChild= newBinaryTree();
lChild.value=value;
}else{
lChild.add(value);
}
}else if(value > this.value){if(this.rChild == null){this.rChild = newBinaryTree();
rChild.value=value;
}else{
rChild.add(value);
}
}
}public boolean isExist(intvalue){if(this.value ==value){return true;
}else if(value < this.value){if(this.lChild == null){return false;
}else{returnlChild.isExist(value);
}
}else{if(null == this.rChild){return false;
}else{returnrChild.isExist(value);
}
}
}public voidpreOrderTraverse(){
System.out.print(this.value + ",");if(null !=lChild)
lChild.preOrderTraverse();if(null !=rChild)
rChild.preOrderTraverse();
}public voidmidOrderTraverse(){if(null !=lChild)
lChild.midOrderTraverse();
System.out.print(this.value + ",");if(null !=rChild)
rChild.midOrderTraverse();
}//非递归中序
public voidmidOrderTraverse2(){
MyArrayStack s = new MyArrayStack();
BinaryTree tmp= this;while((null != tmp) || !s.isEmpty()){if(null !=tmp){
s.push(tmp);
tmp=tmp.lChild;
}else{
BinaryTree tmp2=s.pop();
System.out.print(tmp2.value+ ",");
tmp=tmp2.rChild;
}
System.out.println(s.toString());
}
}public voidpostOrderTraverse(){if(null !=lChild)
lChild.postOrderTraverse();if(null !=rChild)
rChild.postOrderTraverse();
System.out.print(this.value + ",");
}
}interface MyStack{booleanisEmpty();voidclear();intlength();booleanpush(T data);
T pop();
}class MyArrayStack implements MyStack{private Object[] objs = new Object[16];private int size = 0;
@Overridepublic booleanisEmpty() {return size == 0;
}
@Overridepublic voidclear() {//TODO Auto-generated method stub
for (int i = 0; i < objs.length; i++) {
objs[i]= null;
}
size= 0;
}
@Overridepublic intlength() {returnsize;
}
@Overridepublic booleanpush(T data) {if(size >=objs.length){
resize();
}
objs[size++] =data;return true;
}
@SuppressWarnings("unchecked")
@OverridepublicT pop() {if(size <= 0){return null;
}return (T)objs[--size];
}public voidresize(){
Object[] tmp= new Object[objs.length * 3 / 2 + 1];for (int i = 0; i < objs.length; i++) {
tmp[i]=objs[i];
objs[i]= null;
}
objs=tmp;
}
@OverridepublicString toString() {//TODO Auto-generated method stub
StringBuilder sb= newStringBuilder();
sb.append("MyArrayStack: [");for(int i=0; i
sb.append(objs[i].toString());if(i != size - 1){
sb.append(", ");
}
}
sb.append("]");returnsb.toString();
}
}6
/***********************************************************************************
6.从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序:
1,张三,28
2,李四,35
3,张三,28
4,王五,35
5,张三,28
6,李四,35
7,赵六,28
8,田七,35
*************************************************************************************/
packagecom.example;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.util.Comparator;importjava.util.HashMap;importjava.util.Map;importjava.util.TreeSet;importjava.util.Iterator;public classexample6 {public static void main(String[] args) throwsException {
HashMap results = new HashMap();//文件在src路径下
InputStream ips = example6.class.getResourceAsStream("/UserInfo.txt");//文件与类在相同的包下面,可以用相对路径//InputStream ips = example6.class.getResourceAsStream("UserInfo.txt");
BufferedReader br = new BufferedReader(newInputStreamReader(ips));
String line= null;try{while((line = br.readLine()) != null){//System.out.println(line + "aa");
dealLine(line, results);
}
sortResults(results);
}catch(IOException e) {//TODO: handle exception
e.printStackTrace();
}
}static classUser{publicString name;publicInteger value;publicUser(String name, Integer value) {super();this.name =name;this.value =value;
}
@Overridepublic booleanequals(Object obj) {//TODO Auto-generated method stub//下面的代码没有执行,说明往treeset 中增加数据时,不会使用到equals 方法。
System.out.println(super.equals(obj));return super.equals(obj);
}
}public static void sortResults(Mapresults){
TreeSet sortedResults = new TreeSet(new Comparator() {public intcompare(Object o1, Object o2) {
User u1=(User)o1;
User u2=(User)o2;/*如果compareTo 返回结果0,则认为两个对象相等,新的对象不会增加到集合中去
所以,不能直接用下面的代码,否则,那些个数相同的其他姓名就打印不出来。
**/
//return u1.value-u2.value;//return u1.value
if(u1.value >u2.value){return 1;
}if(u1.value
}returnu1.name.compareTo(u2.name);
};
});
@SuppressWarnings("rawtypes")
Iterator iter=results.keySet().iterator();while(iter.hasNext()){
String name=(String)iter.next();
Integer value=(Integer) results.get(name);if(value > 1){
sortedResults.add(newUser(name, value));
}
}
printResults(sortedResults);
}public static void dealLine(String line, Mapmap){if(!"".equals(line.trim())){
String[] results= line.split(",");if(results.length == 3){
String name= results[1];
Integer value=(Integer)map.get(name);if(null ==value){
value= 0;
}
map.put(name, value+ 1);
}
}
}
@SuppressWarnings({"rawtypes"})private static voidprintResults(TreeSet sortedResults){
Iterator iter=sortedResults.iterator();while(iter.hasNext()){
User u=(User)iter.next();
System.out.println(u.name+ ":" +u.value);
}
}
}7
/***********************************************************************************
递归算法题
一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n 的顺序递增,当值大于5000
时,把值按照指定顺序输出来。
例:n=1237
则输出为:
1237,
2474,
4948,
9896,
9896,
4948,
2474,
1237,
提示:写程序时,先致谢按递增方式的代码,写好递增的以后,再增加考虑递减部分。
*************************************************************************************/
packagecom.example;public classexample7 {public static void main(String[] args) throwsException {
doubleNum(1237);
}public static void doubleNum(intn){
System.out.println(n);if(n <= 5000){
doubleNum(n* 2);
}
System.out.println(n);
}
}8
/***********************************************************************************
递归算法题
第1个人10,第2个比第1个人大2岁,依次递推,请用递归方式计算出第8个人多大?
*************************************************************************************/
packagecn.itcast;importjava.util.Date;
publicclass A1 {public staticvoidmain(String [] args) {
System.out.println(computeAge(8));
}public static int computeAge(intn) {if(n==1)return 10;return computeAge(n-1) + 2;
}
}9将数组元素顺序颠倒/***********************************************************************************
有数组a[n],用java 代码将数组元素顺序颠倒
*************************************************************************************/
packagecom.example;importjava.util.Arrays;public classexample11 {public static void main(String[] args) throwsException {int[] arr = new int[10];for(int i=1; i
arr[i]= (int)(Math.random() * 100 + 1);
}
System.out.println(Arrays.toString(arr));
swap(arr);
System.out.println(Arrays.toString(arr));
}//用下面的也可以//for(inti=0,int j=a.length-1;i
public static void swap(int[] arr){int len =arr.length;for(int i=0; i
arr[i]= arr[len - 1 -i];
arr[len- 1 - i] =tmp;
}
}
}
10金额转换/***********************************************************************************
金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。
*************************************************************************************/
packagecom.example;public classexample12 {private static final char[] data = new char[] {'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};private static final char[] units = new char[] {'元','拾','佰','仟','万','拾','佰','仟','亿'};public static void main(String[] args) throwsException {
System.out.println(convert(135009003));
}public static String convert(intmoney) {
StringBuffer sbf= newStringBuffer();int unit = 0;while(money!=0) {
sbf.insert(0,units[unit++]);int number = money%10;
sbf.insert(0,data[number]);
money/= 10;
}//return sbf.toString();//去零,正则表达式
return sbf.toString().toString().replaceAll("零[拾佰仟]","零").
replaceAll("零+万","万").replaceAll("零+元","元").replaceAll("零+","零");
}
}//135009003//不去零 : 壹亿叁仟伍佰零拾零万玖仟零佰零拾叁元//结果 : 壹亿叁仟伍佰万玖仟零叁元
11请设计一个一百亿的计算器
二分查找法
二分查找又称折半查找,它是一种效率较高的查找方法。
二分查找要求:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。
二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,2.寻找{6, 7, 8, 9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下6,即找到了。/*** 二分查找又称折半查找,它是一种效率较高的查找方法。
【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。
*@authorAdministrator
**/
public classBinarySearch {public static voidmain(String[] args) {int[] src = new int[] {1, 3, 5, 7, 8, 9};
System.out.println(binarySearch(src,3));
System.out.println(binarySearch(src,3,0,src.length-1));
}/*** * 二分查找算法 * *
*
*@paramsrcArray
* 有序数组 *
*@paramdes
* 查找元素 *
*@returndes的数组下标,没找到返回-1*/
public static int binarySearch(int[] srcArray, intdes){int low = 0;int high = srcArray.length-1;while(low <=high) {int middle = (low + high)/2;if(des ==srcArray[middle]) {returnmiddle;
}else if(des
high= middle - 1;
}else{
low= middle + 1;
}
}return -1;
}/***二分查找特定整数在整型数组中的位置(递归)
*@paramdataset
*@paramdata
*@parambeginIndex
*@paramendIndex
*@returnindex*/
public static int binarySearch(int[] dataset,int data,int beginIndex,intendIndex){int midIndex = (beginIndex+endIndex)/2;if(data dataset[endIndex]||beginIndex>endIndex){return -1;
}if(data
}else if(data>dataset[midIndex]){return binarySearch(dataset,data,midIndex+1,endIndex);
}else{returnmidIndex;
}
}
}
快速排序/***********************************************************************************
快速排序
3、实现思路。
1.以第一个关键字 K 1 为控制字,将 [K 1 ,K 2 ,…,K n ] 分成两个子区,
使左区所有关键字小于等于 K 1 ,右区所有关键字大于等于 K 1 ,
最后控制字居两个子区中间的适当位置。在子区内数据尚处于无序状态。
2.递归处理左右子区
*************************************************************************************/
packagecom.example;importjava.util.Arrays;public classexample8 {public static void main(String[] args) throwsException {int[] arr = new int[10];for(int i = 0; i
arr[i]= (int)(Math.random() * 100 + 1);
}
System.out.println(Arrays.toString(arr));
quickSort(arr,0, arr.length - 1);
System.out.println(Arrays.toString(arr));//数组被改变
}public static void quickSort(int[] arr, int left, intright){if(left
quickSort(arr, left, pivotloc - 1);
quickSort(arr, pivotloc+ 1, right);
}
}public static int partition(int[] arr, int left, intright){int pivotkey =arr[left];while(left = arr[left]) left++;if(left < right) arr[right--] =arr[left];
}
arr[left]=pivotkey;returnleft;
}
}