您的位置:首页 > 编程语言 > Java开发

同样带来的是四道java笔试题

2015-11-16 22:36 627 查看
//第一道题目:写一个Java应用程序,从键盘输入一个整数,然后输出他们的平方和立方
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

//定义读取键盘输入的类
class Input{
//这里将类型和方法都设置为static为了可以直接调用
static private String s="";
//private int i=10;
static public void input(){
//首先在键盘中输入是System.in这个代码,然后就是就是封装成一个InputStreamReader对象读取,最后再封装成VufferReader对象
//采用缓存读取加快运行速度,大可分三步:1.System.in;2.封装成InputStreamReader读取;3.最后缓存读取BufferReader
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));

try{
s=br.readLine();//br调用方法readLine()一行行读取键盘输入数据并且保存在字符串s中
}catch(IOException e){}
}
static public int togetInput(){
input();
return Integer.parseInt(s);//将键盘读取的字符转换成Integer类型返回,返回相应的整型
}

//public void f(){}
//public void e(){f();System.out.println(i);}
}

//定义一个返回键盘数的平方和立方
class Result{
private static int count=1;
public void run(){
System.out.println("请输入一个整数:");
//然后立即调用类Input中方法togetInput方法,该方法是先调用input方法,先在键盘上的输入并且存入字符串s中
int a=new Input().togetInput();
//最后对象reuslt调用print方法输出输入键盘的整数的平方和立方
print(a);

}
//参数a为键盘输入进来的数
public void print(int a){
System.out.println(a+"a的平方为:"+a*a);
System.out.println(a+"a的立方为:"+a*a*a);
}
}
public class Test2 {

public static void main(String[] args) {
// TODO Auto-generated method stub

Result result=new Result();
result.run();

}

}
//这道题目最主要的一部分就是正确写出java键盘输入,读取

下面是一道与其类似的题目,就是编写一个java程序,来判断从键盘输入的数是不是2的阶次方,比如2,4,8,16等等。

这里键盘输入和上面程序一样都是:System.in 然后封装成InputStreamReader对象,最后使用缓存即封装呈BufferedReader,这道题目判断是不是2的介次方,用到一个巧妙的维运算,就是a和a-1的与运算为0,即是2的介次方。这个读者是可以自行验证是成立的,下面附上代码:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

class InputNum{
private static String s="";
static public void input(){
//同样键盘输入System.in;然后封装成InputStreamReader,最后封装成BufferedReader()对象
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
try{
s=br.readLine();
}catch(Exception e){}
}
static int getInput(){
input();
return Integer.parseInt(s);
}
}

class Judge{
public void judge(int a){
//这里是一个位运算,就是若该数是2的阶次方,该数与其减一做与运算会为0,eg:8是1000,7是0100,8&7=0,4是100,3是010,4&3=0
if(0!=a&&(a&(a-1))==0)
System.out.println("该数是2的阶次方");
else
System.out.println("该数不是2的阶次方");
}
}
public class Test3 {

public static void main(String[] args) {
// TODO Auto-generated method stub
Judge j=new Judge();
System.out.println("请输入一个整数:");
int a=InputNum.getInput();
j.judge(a);
}

}

第三道题目是:把一个数组里的数组合并全部列出,比如1,2列出来是1,2,12,21,给出数组是{1,2,3,4}列出所有的四组组合。

这道题目同样是道算法题目,需要使用递归思想:理解和注释我都写在代码中了:

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class Test4 {

public static void main(String[] args) {
// TODO Auto-generated method stub
//定义一个String类型数组,这里别定义成int类型数组,Array.asList方法不支持基本类型的数组作参数,若是基本类型会是乱码

//String[] array=new String[]{"1","2"};
//String[] array=new String[]{"1","2","3"};
String[] array=new String[]{"1","2","3","4"};//这里为了了解递归算法,我从简单到复杂进行理解

listAll(Arrays.asList(array),"");//这里定义了一个方法就是核心算法实现,初始参数为一个链表,另外一个参数为一个String类型
}
static public void listAll(List c,String s){
//这里使用isEmpty()方法就是为了显示出来更整洁,实际就是当该链表里面的元素都remove完再打印出结果
if(c.isEmpty()){
System.out.println(s);//这里的s就是我们需要的结果,这里是个String类型,就是把依次remove的结果组合起来打印出来
}

//这里就是核心算法,我刚开始理解时也没有完全理解对,看了网上别人的讲解略懂,这里也只是个人的理解
//最核心你可以理解为按先后顺序remove元素,然后组合在一起,这里实现先后就是利用for循环对下标进行操作
//然后就是递归思想,把3个转化2个,最后转化成1个这里也不好解释,我就把网上的2个数的详细分析贴出来大家看看,我相信3个,4个也很快可以理解
for(int i=0;i<c.size();i++){
List<String> temp=new LinkedList<String>(c);
listAll(temp,s+temp.remove(i));
}
}// c= 1->2
//第一次:
//temp = 1->2 除去第i个位置的数,这里是0位置的数,也就是1
//循环temp.size()也就是两次
//调用递归函数,打印刚移去的数:1,再调用一次,此时移去的是2,加上上次移去的1,此次打印的是12
//第二次:
//temp = 1->2 除去第i个位置的数,这里是1位置的数,也就是2
//循环temp.size()也就是两次
//调用递归函数,打印刚移去的数:2,再调用一次,此时移去的是1,加上上次移去的2,此次打印的是21

}
第四道题:

试用递归计算斐波那契数列,并且确定递归次数,假设输入的数为10。

这题目不难,但需要了解java中Scanner类可以方便读取键盘输入流,然后再调用相应的输入方法来获取输入类型存储在相应的基本类型变量中即可,第二个就是确定递归的次数,这个很多人会出错,我在代码中也详细解释了:

import java.util.Scanner;

public class Test1 {
//这个递归并不难,这题出错的地方很可能是确定递归的次数,我第一次也以为在递归方法中加个K++即可,因为没调用方法一次就自加一次即可,其实不以为然,而是放到递归的根源处才正确
//希望大家也要主要这些小问题
private static int k=0;
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//Scanner 被称为输入流扫描器类,这里需要知道一下new一个Scanner对象可以为键盘输入,使用System.in完成键盘输入
//使用此类可以方便的完成输入流的输入操作
Scanner cin=new Scanner(System.in);
//这里Scanner类中的nextLong返回键盘输入的Long类型,其他类型会抛异常!这里cin对象调用nextLong()方法获取键盘输入的流,并且存入Long变量a中
long a=cin.nextLong();
//调用fibonacci方法
System.out.println(fibonacci(a));
System.out.println("递归了"+k+"次");
}

public static long fibonacci(Long a){
//k++;//将统计次数仅仅放到方法内部是不正确的,因为调用方法一次不代表就递归一次,因为递归最根本的就是方法调用自身,这样次数会乱掉,而应放到递归的根源处
if(a==0||a==1){
k++;//这里主要掌握需要确定递归的次数,需要把统计次数变量放到递归的根源,因为每计算一个新变量都会一直递归到根源出,即递归一次
return a;
}
else
//这里也就是fibonacci数列的核心算法,就是后一项等于前两项之和(当然该死(项数》>=3),递归就递归前两项数分别为多少,直到找到第一,第二个数依次推算出来
return fibonacci(a-1)+fibonacci(a-2);
}

}


后面我都会尽量每天都带来一些经典的java面试笔试题目,一是就是希望可以和大家一起分享分享,二是可以把这个csdn平台当作笔记的一部分。最近为什么一直关注面试笔试题目呢,也是有原因的:1.笔试面试毕竟都是基础,任何事情基础不牢固,其他什么都是泡沫;2.自己研究生读的也很心累很憋屈,为什么我每次都吐槽一下呢(这里只是吐槽一下我们学校学院的研究生),我们每天科研的东西跟自己未来没有半毛钱关系,而且不是自己喜欢的,没错做一个件事情,兴趣才是最重要的,话虽说在学校每天很轻松,不用什么早起贪黑,不用什么工作压力,但是身为一个男生特别是在20多岁的时候不该是贪图劳逸的样子,研究生好比温水煮青蛙,也不多说就一句TM的没叼用,我开始一点也不喜欢编程语言,当然现在也不是很喜欢,起码不像研究生那样方案厌恶吧。对于java来说,我还是可以接受,也挺想学好的,因为自己是自学,而且接触时间比较短,可能很多地方理解不对或者不懂,但是高手也是一步步这样过来的,万事开头难,贵在坚持嘛。看千剑而后识器,操千曲而后知音。我希望各位java初学者可以和我一样坚持下来!最后一句:能不读研尽量别读研,要实在想读研也找个事少好毕业的老师吧。不然你的大好前途都毁在科研上面了!感谢CSDN给我这个每天又可以发泄吐槽又可以学习的平台,坚持每天更新把!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: