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