Java练习十题集(一)

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;

}

}

  

以上是 Java练习十题集(一) 的全部内容, 来源链接: utcz.com/z/395066.html

回到顶部