Java练习十题集(一)

Java练习十题集(一):

1. 将26个字母按形如手机键盘的对应形式转换成0~9数字。

2.写两个线程,其中一个线程打印1-52,另一个打印A-Z,打印顺序为12A34B56C....5152Z。

3.使用循坏输出九九乘法表。输出如下结果:

1×1=1
2×1=2,2×2=4
3×1=3,3×2=6,3×3=9
......
9×1=9,9×2=18,9×3=27,… 9×9=81

4.Java求最大公约数和最小公倍数。

5.2~200之间有多少素数,分别是多少。

6.分别编写出计算Hermite多项式Hn (x) 值的递推和递归函数。Hn (x) 定义为
H0(x)=1 (n=0)
H1(x)=2x (n=1)
Hn(x)=2xHn-1(x) -2(n- 1)Hn-2(x) (n>1)

7.写出计算Ackemam函数Ack (m, n)的递归计算函数。对于m≥0, n≥0, Ack(m,n)定义为:
Ack(0,n)= n+1
Ack(m,0)= Ack(m-1,1)
Ack(m,n)= Ack(m- 1,Ack(m,n-1)) 

8.编写函数,求1-3+5-7+...+n。提示:函数应该有一个参数,通过这个参数得到n的值。

9.小萌的副本生涯

【题目描述】
在主城站街很久之后,小萌决定不能就这样的浪费时间虚度青春,他打算去打副本。
这次的副本只有一个BOSS,而且BOSS是不需要击杀的,只需要和它比智力…….
BOSS会列出一正整数的序列,由小萌先开始,然后两个人轮流从序列的任意一端取数,取得的数
累加到积分里,当所有数都取完,游戏结束。
假设小萌和BOSS都很聪明,两个人取数的方法都是最优策略,问最后两人得分各是多少。
输入
第一行:一个正整数N(2 ≤ N ≤ 100),表示序列中正整数的个数。
第二行至末尾:用空格隔开的N个正整数(1 ≤ a[i] ≤ 200)
输出
只有一行,用空格隔开的两个数,小萌的得分和BOSS的得分。
样例输入
6
4 7 2 9 5 2
样例输出
11 18

10.假设你能重返过去,现在让你回到2015年,你能选择一支股票进行投资,你拥有这支股票未来n天的价格走势图,为了躲避证监会
的监控,你只有一次买入卖出机会。现在要求实现一个程序计算哪天买入哪天卖出能获得最大收益。

输入
第一行为天数n
接下来n行 为数组的n个整数元素,代表第n天该股票的价格
输出
输出为b,s #代表第b天买入,第s天卖出
天数从0开始
如果没有适合的买入卖出输出-1,-1
同样收益时越晚买入越早卖出更符合需要
样例输入
5
2
1
4
5
3
样例输出
1, 3

1. 将26个字母按形如手机键盘的对应形式转换成0~9数字。

import java.util.HashMap;
import java.util.Map;

public class Test {

    public static void main(String[] args) {
        Map<String,Integer> map = getMapKV();
        String str = "Hello World";
        System.out.println(str);
        str = str.toUpperCase();
        for(int i = 0; i < str.length(); i++) {
            System.out.print(map.get(str.charAt(i)+""));
        }
        System.out.println( );
    }

    static Map<String,Integer> getMapKV(){
        Map<String,Integer> map = new HashMap<>();
        map.put(" ", 0);
        for(int i = 0; i < 26; i++){
            String key = "" + (char)(i+'A');
            if(i<3){
                map.put(key,2);
            }else if(i < 6){
                map.put(key,3);
            }else if(i < 9){
                map.put(key,4);
            }else if(i < 12){
                map.put(key,5);
            }else if(i < 15){
                map.put(key,6);
            }else if(i < 18){
                map.put(key,7);
            }else if(i < 21){
                map.put(key,8);
            }else if(i < 26){
                map.put(key,9);
            }
        }
        return map;
    }

}

 

2.写两个线程,其中一个线程打印1-52,另一个打印A-Z,打印顺序为12A34B56C....5152Z。

public class Test {

    public static void main(String[] args) {
        threadTest();
    }
    static void threadTest(){
        Object obj = new Object();
        Digit digit = new Digit(obj);
        Letter letter = new Letter(obj);
        Thread th1 = new Thread(digit);
        Thread th2 = new Thread(letter);
        th1.start();//数字的线程先运行,数字先执行
        th2.start();
    }
}
class Digit implements Runnable{
    private Object obj;//声明一个类的引用
    public Digit(Object obj){
        this.obj = obj;	//通过构造器将共享的资源-->对象传进来
    }
    @Override
    public void run() {
        synchronized(obj){//给共享资源上锁
            for(int i = 1;i < 53;i++ ){
                System.out.print(i);
                if(i % 2 == 0){
                    obj.notify();//唤醒其他线程
                    try {
                        obj.wait();//等待并释放锁
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

class Letter implements Runnable{    
    private Object obj;
    public Letter(Object obj){
        this.obj = obj;
    }
    @Override
    public void run() {
        synchronized(obj){
            for(int i = 0;i < 26;i++ ){
                System.out.print((char)(i+'A'));
                obj.notify();//唤醒其他线程
                try {
                    obj.wait();//释放锁等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

3.使用循坏输出九九乘法表。输出如下结果:

1×1=1
2×1=2,2×2=4
3×1=3,3×2=6,3×3=9
......
9×1=9,9×2=18,9×3=27,… 9×9=81

public class Test {

    public static void main(String[] args) {
        multiplicationTableTest();
        System.out.println("----------------------");
        multiplicationTableRecursionTest(9);
    }

    static void multiplicationTableTest() {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                if (i == j) {
                    System.out.print(j + "*" + i + "=" + i * j + " ");
                } else {
                    System.out.print(j + "*" + i + "=" + i * j + ",");
                }
            }
            System.out.println();
        }
    }

    /**
     * 使用递归方法输出99乘法表
     */
    public static void multiplicationTableRecursionTest(int i) {
        if (i == 1) {
            System.out.println("1*1=1");
        } else {
            multiplicationTableRecursionTest(i - 1);
            for (int j = 1; j <= i; j++) {
                if (i == j) {
                    System.out.print(j + "*" + i + "=" + i * j + " ");
                } else {
                    System.out.print(j + "*" + i + "=" + i * j + ",");
                }
            }
            System.out.println(" ");
        }
    }
}

  

4.Java求最大公约数和最小公倍数。

 

public class Test {

    public static void main(String[] args) {

        int gcd = greatestCommonDivisor(120,90);
        System.out.println(gcd);
        int lcm = leastCommonMultiple(120,90);
        System.out.println(lcm);

    }

    static int greatestCommonDivisor(int m, int n){
        //辗转相除
        int result = 0;
        int max = m > n ? m : n;
        int min = m > n ? n : m;
        if(max % min == 0){
            result = min;
        }
        while(max % min > 0){
            max = max % min;
            if(max < min) {  //交换再辗转相除
                max = max + min;
                min = max - min;
                max = max - min;
            }
            if(max % min == 0){
                result =  min;
            }
        }
        return result;
    }

    static int leastCommonMultiple(int m, int n) {
        int ret = m * n / greatestCommonDivisor(m, n);
        return ret;
    }

}

  

5.2~200之间有多少素数,分别是多少。

素数又称质数,有无限个。质数(素数)定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。

public class Test {

    public static void main(String[] args) {

        primeTest();

    }

    static void primeTest(){
        System.out.println("1~200内的素数有:");
        int count = 0;
        for(int i = 1; i < 200; i++){
            if(isPrime(i)){
                System.out.print(i+",");
                count++;
            }
        }
        System.out.println();
        System.out.println("共有"+count+"个素数。");
    }

    static boolean isPrime(int n ){

        boolean bln = true;
        if(n < 2 ){
            return false;
        }
        for(int i = 2; i < n/2; i++) {
            if(n%i == 0 ){
                bln = false;
                return bln;
            }
        }
        return bln;
    }

}

  

6.分别编写出计算Hermite多项式Hn (x) 值的递推和递归函数。Hn (x) 定义为
H0(x)=1 (n=0)
H1(x)=2x (n=1)
Hn(x)=2xHn-1(x) -2(n- 1)Hn-2(x) (n>1)

public class Test {

    public static void main(String[] args) {
        testRecH();
    }

    static void testRecH(){
        int x = recH(12);
        System.out.println(x);
    }

    static int recH(int n){
        if(n == 0){
            return 1;
        }else if(n == 1){
            return 2*n;
        }else {
            return 2*recH(n-1)-2*(n-1)*recH(n-2);
        }
    }
}

  

7.写出计算Ackemam函数Ack (m, n)的递归计算函数。对于m≥0, n≥0, Ack(m,n)定义为:
Ack(0,n)= n+1
Ack(m,0)= Ack(m-1,1)
Ack(m,n)= Ack(m- 1,Ack(m,n-1)) 

public class TestAck {

    public static void main(String[] args) {
        testRrecAck();
    }

    static void testRrecAck(){
        long x = recAck(3,5);
        System.out.println(x);
    }

    static long recAck(long m, long n){
        if(m == 0){
            return n+1;
        } if(n == 0){
            return recAck(m-1,1);
        }else{
            return recAck(m-1,recAck(m,n-1));
        }
    }
}

  

8.编写函数,求1-3+5-7+...+n。提示:函数应该有一个参数,通过这个参数得到n的值。

 

public class Test {

    public static void main(String[] args) {
        testSumFunc(12);
    }

    static void testSumFunc(int n) {
        for(int i = 1; i <= n; i++) {
            if(i%2 == 0) {
                int x = (-1)*(2*i-1);
                System.out.print(x);
            }else {
                if(i != 1) {
                    System.out.print("+"+(2*i-1));
                } else {
                    System.out.print(i);
                }
            }
        }
        System.out.print("=" + sumFunc(n));
        System.out.println( );
    }

    static int sumFunc(int m) {
        int sum = 0;
        for(int i = 1; i <= m; i++) {
            if(i%2 == 0) {
                sum += (-1)*(2*i-1);
            }else {
                sum+= (2*i-1);
            }
        }
        return sum;
    }

    static int sumFunc2(int m) {
       if (m % 2 == 0) {
            return -m;
       } else {
           return m;
       }
    }
}

  

9. 小萌的副本生涯

【题目描述】
在主城站街很久之后,小萌决定不能就这样的浪费时间虚度青春,他打算去打副本。
这次的副本只有一个BOSS,而且BOSS是不需要击杀的,只需要和它比智力…….
BOSS会列出一正整数的序列,由小萌先开始,然后两个人轮流从序列的任意一端取数,取得的数
累加到积分里,当所有数都取完,游戏结束。
假设小萌和BOSS都很聪明,两个人取数的方法都是最优策略,问最后两人得分各是多少。
输入
第一行:一个正整数N(2 ≤ N ≤ 100),表示序列中正整数的个数。
第二行至末尾:用空格隔开的N个正整数(1 ≤ a[i] ≤ 200)
输出
只有一行,用空格隔开的两个数,小萌的得分和BOSS的得分。
样例输入
6
4 7 2 9 5 2
样例输出
11 18

 

import java.util.Arrays;
import java.util.Scanner;

public class Test {

    public static void main(String[] args) {
        Test();
    }

    static void Test() {
        System.out.print("第一行:一个正整数N(2 ≤ N ≤ 100),表示序列中正整数的个数。");
        Scanner in = new Scanner(System.in);
        int x = in.nextInt();
        System.out.println(x);
        in = new Scanner(System.in);
        String s = in.nextLine();
        System.out.println(s);
        String[] str = s.split("\\s+");
        System.out.println("数组长度:"+str.length);
        int[] arr = new int[str.length];
        for (int i = 0; i < arr.length; i++) {
            if(!"".equals(str[i].trim())){
                arr[i] = Integer.parseInt(str[i].trim());
            }
        }
        System.out.println(Arrays.toString(arr));
        play(arr);
    }

    static void play(int[] arr){
        int cute = 0, boss = 0;
        int i = 0, k = arr.length-1;
        int count = 0;
        while (i <= k){
            if(arr[i] >= arr[k]){
                if(count % 2 == 0){
                    cute += arr[i];
                }else{
                    boss += arr[i];
                }
                i++;
            } else {
                if(count % 2 == 0){
                    cute += arr[k];
                }else{
                    boss += arr[k];
                }
                k--;
            }
            count++;
        }
        System.out.println(cute+" "+boss);
    }

}

  

 

10.假设你能重返过去,现在让你回到2015年,你能选择一支股票进行投资,你拥有这支股票未来n天的价格走势图,为了躲避证监会
的监控,你只有一次买入卖出机会。现在要求实现一个程序计算哪天买入哪天卖出能获得最大收益。

输入
第一行为天数n
接下来n行 为数组的n个整数元素,代表第n天该股票的价格
输出
输出为b,s #代表第b天买入,第s天卖出
天数从0开始
如果没有适合的买入卖出输出-1,-1
同样收益时越晚买入越早卖出更符合需要
样例输入
5
2
1
4
5
3
样例输出
1, 3

import java.util.Arrays;
import java.util.Scanner;

public class Test {

    public static void main(String[] args) {
        Test();
    }

    static void Test(){
        System.out.print("please enter N : ");
        Scanner in  = new Scanner(System.in);
        System.out.println();
        int n = in.nextInt();
        int[] arr = new int[n];
        for(int i = 0; i < n; i++){
            in  = new Scanner(System.in);
            arr[i] =  in.nextInt();
        }
//        System.out.println(Arrays.toString(arr));
        int max = indexExtremeValueArr(arr,arr.length,true);
        int min = indexExtremeValueArr(arr,max,false);
        if(max == 0 && min == 0){
            System.out.println("-1, -1");
        }else {
            System.out.println(min+" , "+max);
        }

    }

    /**
     * 0~ x 中最大或者最小数的位置
     * @param arr
     * @param x
     * @param flag true取最大值,false取最小值(数组前x个数中)
     * @return
     */
    static int indexExtremeValueArr(int[] arr,int x, boolean flag){
        int index = 0;
        x = x < arr.length ? x : arr.length;
        if(arr.length == 1) {
            return 0;
        }
        if(flag){   //或取极大值的位置
            for(int i = 1; i < x; i++) {
                if(arr[i] > arr[i-1]){
                    index = i;
                }
            }
        } else {    //或取极小值的位置
            for(int i = 1; i < x; i++) {
                if(arr[i] <= arr[i-1]){
                    index = i;
                }
            }
        }
        return index;
    }
}

  

posted @ 2018-12-11 14:19  loytime  阅读(512)  评论(0编辑  收藏  举报