1.判2的乘方
題目:實現一個方法,判斷一正整數是不是2的乘方(好比16是2的4次方,返回true;18不是2的乘方,返回false)要求性能儘量高。java
解法一:建立一箇中間變量Temp,初始值是1,而後進入一個循環,循環中每次讓Temp和目標整數比較,若是相等,則說明目標整數是2的乘方,若是不相等,則讓Temp增長一 倍,繼續循環比較。讓Temp大於目標整數時,說明目標整數不是2的乘方。node
1 public static boolean isPowerOf2(int number) {
2 int temp = 1;
3 while (temp <= number) {
4 if (temp == number)
5 return true;
6 }
7 return false;
8 }
View Code
解法二:把解法一的乘以2操做改爲向左移位,移位的性能比乘法高的多,代碼以下:git
1 public static boolean isPowerOf2(int number) {
2 int temp = 1;
3 while (temp <= number) {
4 if (temp == number){
5 return true;
6 }
7 temp = temp<<1;
8 }
9 return false;
10 }
View Code
前兩種算法的時間複雜度是O(logN).算法
解法三:編程
1) 把前兩種解法的2的乘方的結果轉換成2進制數,十進制的2轉化成二進制是10B,4轉換成二進制是100B,8轉換成二進制是1000B...以下圖數組
2)即只要是2的乘方的數轉換成二進制結果中只有一個1,再把這些2的乘方都減去1,轉換成二進制數爲:緩存
3)用2的乘方的自己和它減去1的結果進行按位與運算,也就是N&N-1,結果以下:微信
即只有是2的乘方,按以上步驟結果都爲0,代碼以下app
public static boolean ispowerOf2(Integer number){
return (number & number - 1) == 0;
}
該算法的時間複雜度爲O(1)。ide
2.篩法求素數
解法:
1 using System;
2 public class PrimeFilter{
3 public static void Main( string [] args ){
4 int N = 100;
5 bool [] a = new bool[N+1];
6 for( int i=2; i<=N; i++ ) a[i]=true;
7
8 for( int i=2; i<N; i++ )
9 {
10 if(a[i]) for( int j=i*2; j<=N; j+=i )
11 a[j]=false;
12 }
13
14 for( int i=2; i<=N; i++)
15 if( a[i] ) Console.Write( i + " " );
16 }
17 }
View Code
3.找素數
請編寫程序,從鍵盤輸入兩個整數m,n,找出等於或大於m的前n個素數。
輸入格式:
第一個整數爲m,第二個整數爲n;中間使用空格隔開。例如:
103 3
輸出格式:
從小到大輸出找到的等於或大於m的n個素數,每一個一行。例如:
103
107
109
輸入樣例:
9223372036854775839 2
輸出樣例:
9223372036854775907 9223372036854775931
解法:
1 import java.math.BigInteger;
2 import java.util.Scanner;
3 public class Main {
4 public static void main(String[] args){
5 Scanner in = new Scanner(System.in);
6 BigInteger m;
7 int n;
8
9 m=in.nextBigInteger();
10 n=in.nextInt();
11 int cnt=0;
12 while (cnt<n){
13 if (m.isProbablePrime(100)){
14 System.out.println(m);
15 cnt++;
16 }
17 m=m.nextProbablePrime();
18 }
19 in.close();
20 }
21 }
View Code
4.計算正五邊形的面積和周長
從下列的抽象類shape類擴展出一個正五邊形(regular pentagon)類RPentagon,這個類將正五邊形的邊長做爲私有成員,類中包含初始化這個值的構造方法。
public abstract class shape {// 抽象類
/ 抽象方法 求面積 / public abstract double getArea();
/ 抽象方法 求周長 / public abstract double getPerimeter(); }
請編程從鍵盤輸入正五邊形的邊長值,建立一個正五邊形對象,而後輸出正五邊形的面積和正五邊形的周長。計算正五邊形的面積公式爲: S=5a^2/(4tan(36度))其中a爲邊長。 或者:S=(1/4)a^2√(25+10√5) 輸出結果保留4位小數。
輸入格式:
輸入正五邊形的邊長。例如:
5
輸出格式:
輸出正五邊形的面積和周長。第一行輸出面積,第二行輸出周長。例如: 43.0119
25
輸入樣例:
16.8
輸出樣例:
485.5875 84
解法:
1 import java.util.Scanner;
2 abstract class Shape{
3 abstract double getArea();
4 abstract double getPerimeter();
5 }
6 class RPentagon extends Shape{
7 private double a;
8 public RPentagon(double a){
9 this.a = a;
10 }
11 public double getArea(){
12 return 0.25*a*a*Math.sqrt(25+10*Math.sqrt(5));
13 }
14 public double getPerimeter() {
15 return 5*a;
16 }
17
18 }
19 public class Main {
20
21 public static void main(String[] args) {
22 Scanner in = new Scanner(System.in);
23 double b=in.nextDouble();
24 RPentagon r= new RPentagon(b);
25 System.out.println(String.format("%.4f",r.getArea()));
26 System.out.println((int)r.getPerimeter());
27 }
28
29 }
View Code
5.簡單的計算器
編程實現一個簡單的計算器,實現兩個整數的加、減、乘、除。 注意:輸入的數字爲整數,可能大於Long.MAX_VALUE (即: 9223372036854775807)
輸入格式:
例如輸入被除數和除數,除號是「/」:
199818221687230837883277970155607217447/15607605175531087007(除法運算)
輸出格式:
12802618943776012921 (輸出商)
輸入樣例:
268757455632088758902114193354244344883-187825044215992922193584201757800947591
輸出樣例:
80932411416095836708529991596443397292
提示:
一. 當字符串對象str存儲的值爲"199818221687230837883277970155607217447/15607605175531087007"時,下面的方法能夠將str從除號"/"處分割成兩個字符串:
String[] ob = str.split("\D", 0);
這時,ob[0]的值爲"199818221687230837883277970155607217447";
ob[1]的值爲"15607605175531087007".
二. 若是要檢測字符串中是否包含除號'/',能夠用下面的方法檢測:
(in1.indexOf('/') != -1)爲true,表示包含'/'。
解法:
1 import java.math.BigDecimal;
2
3 import java.util.Scanner;
4 public class Main {
5 public static void main(String [] args){
6 Scanner scanner = new Scanner(System.in);
7 String s = scanner.nextLine();
8 char [] key = {'+', '-', '*', '/'};
9 int len = -1;
10 int flag = 0;
11 for (int i = 0; i < key.length; i++) {
12 len = s.indexOf(key[i]);
13 if (len != -1){
14 flag = i;
15 break;
16 }
17 }
18 BigDecimal m = new BigDecimal(s.substring(0, len));
19 BigDecimal n = new BigDecimal(s.substring(len + 1));
20 switch (flag){
21 case 0:{
22 System.out.println(m.add(n));
23 break;
24 }
25 case 1:{
26 System.out.println(m.subtract(n));
27 break;
28 }
29 case 2:{
30 System.out.println(m.multiply(n));
31 break;
32 }
33 case 3:{
34 System.out.println(m.divide(n));
35 break;
36 }
37 }
38 }
39
40 }
View Code
6.求解給定字符串的前綴
求解給定字符串的前綴。
輸入格式:
輸入數目不定的多對字符串,每行兩個,以空格分開。 例如:filename filepathTom Jack
輸出格式:
返回兩個字符串的最大前綴,例如:The common prefix is fileNo common prefix
輸入樣例:
filename filepath Tom Jack
輸出樣例:
The common prefix is file No common prefix
解法:
1 public class Main6 {
2 public static String prefix(String s1, String s2){
3 StringBuffer stringBuffer = new StringBuffer("");
4 StringBuffer no = new StringBuffer("No common prefix");
5 StringBuffer yes = new StringBuffer("The common prefix is ");
6 boolean hasPrefix = false;
7 int i=0;
8 while (i<s1.length()&&i<s2.length()){
9 if (s1.charAt(i)==s2.charAt(i)) {
10 hasPrefix=true;
11 stringBuffer.append(s1.charAt(i));
12 i++;
13 }
14 else {
15 break;
16 }
17 }
18 if (hasPrefix){
19 stringBuffer=yes.append(stringBuffer);
20 }else{
21 stringBuffer=no.append(stringBuffer);
22 }
23 return new String(stringBuffer);
24 }
25 public static void main(String[] args){
26 String string1,string2;
27 Scanner in = new Scanner(System.in);
28 while (in.hasNext()) {
29 string1 = in.next();
30 string2 = in.next();
31 System.out.println(prefix(string1, string2));
32 }
33 in.close();
34 }
35 }
View Code
7.找出最大的對象
(找出最大的對象)編寫一個方法,返回對象數組中最大的對象。方法簽名以下:public static Object max(Comparable[] a)全部對象都是Comparable接口的實例。對象在數組中的順序是由compareTo方法決定的。編寫測試程序,從鍵盤輸入5個字符串和5個整數,建立一個由5個字符串構成的數組、一個由5個整數構成的數組。找出數組中最大的字符串、整數並輸出。
輸入格式:
輸入Xi'an (輸入5個字符串,每行一個)BeijingShangHaiGuangZhouShenZhen8 9 12 7 6 (輸入5個整數,以空格分隔)
輸出格式:
輸出 Max string is Xi'an (輸出最大的字符串)Max integer is 12 (輸出最大的整數)
輸入樣例:
France Japan German China India 6 34 89 168 53
輸出樣例:
Max string is Japan Max integer is 168
解法:
1 import java.util.Arrays;
2 import java.util.Scanner;
3 public class Main {
4
5 public static void main(String[] args) {
6 @SuppressWarnings("resource")
7 Scanner sc = new Scanner(System.in);
8 String [] list1 = new String[5];
9 int [] list2 = new int[5];
10 for(int i=0;i<5;i++){
11 String str1 = sc.next();
12 list1[i]=str1;
13 }
14 for(int i=0;i<5;i++){
15 int str2 = sc.nextInt();
16 list2[i]=str2;
17 }
18
19
20 Arrays.sort(list1);
21 Arrays.sort(list2);
22 System.out.println("Max string is "+list1[4]);
23 System.out.println("Max integer is "+list2[4]);
24 }
25 }
View Code
8. 使用公曆類GregorianCalendar
使用公曆類 GregorianCalendar,公曆類 GregorianCalendar有方法setTimeInMillis(long);能夠用它來設置從1970年1月1日算起的一個特定時間。請編程從鍵盤輸入一個長整型的值,而後輸出對應的年、月和日。例如輸入:1234567898765,輸出:2009-1-14
輸入格式:
輸入1234567898765 (毫秒數)
輸出格式:
輸出2009-1-14 (輸出年、月和日,實際應該是2月,由於Java API 從0開始計算月份)
輸入樣例:
1450921070108
輸出樣例:
2015-11-24
解法:
1 import java.util.Calendar;
2 import java.util.Scanner;
3
4 public class Main {
5 public static void main(String [] args){
6 Scanner scanner = new Scanner(System.in);
7 String s = scanner.nextLine();
8 Calendar ca = Calendar.getInstance();
9 ca.setTimeInMillis(Long.parseLong(s));
10 System.out.println(ca.get(Calendar.YEAR ) + "-"
11 + ca.get(Calendar.MONTH) + "-" + ca.get(Calendar.DAY_OF_MONTH));
12 }
13
14 }
View Code
9.查找電話號碼
文件phonebook1.txt中有若干聯繫人的姓名和電話號碼。高富帥 13312342222白富美 13412343333孫悟空 13512345555唐三藏 13612346666豬悟能 13712347777沙悟淨 13812348888請你編寫一個簡單的通訊錄程序,當從鍵盤輸入一個姓名時查找到對應的電話號碼並輸出。若是沒找到則顯示Not found. 因爲目前的自動裁判系統暫時不能支持用戶讀入文件,咱們編寫程序從鍵盤輸入文件中的姓名和電話號碼,當輸入的名字爲noname時,表示結束。noname後面有一個名字,須要查找其對應的電話號碼。
輸入格式:
高富帥 13312342222白富美 13412343333孫悟空 13512345555唐三藏 13612346666豬悟能 13712347777沙悟淨 13812348888noname (表示結束)唐三藏 (須要查找此人的電話號碼)
輸出格式:
13612346666 (輸出對應的電話號碼)
輸入樣例:
白富美 13412343333 孫悟空 13512345555 唐三藏 13612346666 豬悟能 13712347777 沙悟淨 13812348888 noname 白骨精
輸出樣例:
Not found.
解法:
方法一:
1 import java.util.HashMap;
2 import java.util.Map;
3 import java.util.Scanner;
4
5 public class Main4 {
6
7 public static void main(String[] args) {
8 Map<String,String> phone = new HashMap<String,String>();
9 Scanner in = new Scanner(System.in);
10 while(true) {
11 String name = in.next();
12 if(name.equals("noname")) {
13 break;
14 }
15 String phoneNumber = in.next();
16 phone.put(name, phoneNumber);
17 }
18 String s = in.next();
19 if(!phone.containsKey(s)) {
20 System.out.println("Not Found。");
21 }
22 else{
23 System.out.println(phone.get(s));
24 }
25 in.close();
26 }
27 }
View Code
方法二:(優化)
1 import java.util.HashMap;
2 import java.util.Map;
3 import java.util.Scanner;
4
5 public class Main {
6 public static void main(String[] args) {
7 Map<String, String> list = new HashMap<String, String>();
8 String s;
9 Scanner scanner = new Scanner(System.in);
10 String a= scanner.next();
11
12 while (!a.equals("noname")) {
13 s = scanner.next();
14
15 list.put(a, s);
16 a = scanner.next();
17
18 }
19 String string = scanner.next();
20 if (list.get(string) != null) {
21 System.out.println(list.get(string));
22 }
23
24 else {
25 System.out.println("Not found.");
26 }
27
28 }
29 }
View Code
10.日期加減
請編程從鍵盤輸入一個長整型的值,該值表示從1970年1月1日算起的一個特定時間(毫秒數),以此時間構造一個日期對象。再輸入一個普通整型值,該值表示天數,加上該天數後,而後輸出對應的年、月、日。
輸入格式:
1234567898765 (第一行輸入一個長整型數)
158 (第二行輸入一個普通整型數,表示天數)
輸出格式:
2009-02-14
2009-07-22
輸入樣例:
1234567898765 158
輸出樣例:
2009-02-14 2009-07-22
解法:
1 import java.text.SimpleDateFormat;
2 import java.util.*;
3 public class Main3 {
4
5 public static void main(String[] args) {
6 Scanner in = new Scanner(System.in);
7 Calendar date = Calendar.getInstance();
8 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
9 long l = in.nextLong();
10 Long i = in.nextLong();
11 date.setTimeInMillis(l);
12 long n=i*24*60*60*1000+l;
13 Date date2 = new Date(n);
14 System.out.println(format.format(date.getTime()));
15 System.out.println(format.format(date2));
16 }
17 }
View Code
11.字符串替換
將文本文件中指定的字符串替換成新字符串。 因爲目前的OJ系統暫時不能支持用戶讀入文件,咱們編寫程序從鍵盤輸入文件中的內容,當輸入的一行爲end時,表示結束。end後面有兩個字符串,要求用第二個字符串替換文本中全部的第一個字符串。
輸入格式:
Xi’an Institute of Posts and Telecommunications is co-designed and implemented by the People’s Government of Shaanxi Province and the Ministry of Industry and Information Technology. The Institute is located in Xi’an, a historic city in Northwest China, famous for its magnificent ancient culture.end (表示結束)Institute (第一個字符串,要求用第二個字符串替換)University (第二個字符串)
輸出格式:
Xi’an University of Posts and Telecommunications is co-designed and implemented by the People’s Government of Shaanxi Province and the Ministry of Industry and Information Technology.The University is located in Xi’an, a historic city in Northwest China, famous for its magnificent ancient culture.
輸入樣例:
Xi’an Institute of Posts and Telecommunications is co-designed and implemented by the People’s Government of Shaanxi Province and the Ministry of Industry and Information Technology. The Institute is located in Xi’an, a historic city in Northwest China, famous for its magnificent ancient culture. end Institute University
輸出樣例:
Xi’an University of Posts and Telecommunications is co-designed and implemented by the People’s Government of Shaanxi Province and the Ministry of Industry and Information Technology.The University is located in Xi’an, a historic city in Northwest China, famous for its magnificent ancient culture.
解法:
1 import java.util.ArrayList;
2 import java.util.Scanner;
3
4 public class Tihua5_2 {
5
6 public static void main(String[] args) {
7 ArrayList<String> ls = new ArrayList<String>();
8 Scanner in = new Scanner(System.in);
9 int len = 0;
10 ls.add(in.nextLine());
11 while (ls.get(len).compareTo("end") != 0) {
12 len++;
13 ls.add(in.nextLine());
14 }
15 String a = in.nextLine();
16 String b = in.nextLine();
17 String[] ss = new String[len];
18 for (int i = 0; i < len; i++)
19 ss[i] = ls.get(i).replace(a, b);
20 for (int i = 0; i < len; i++)
21 System.out.println(ss[i]);
22 in.close();
23 }
24
25 }
View Code
12.大數整除
請編寫程序,從鍵盤輸入一個整數n,找出大於long.MAX_VALUE且能被n整除的前3個數字。
輸入格式:
輸入一個做爲除數的整數n,例如: 17
輸出格式:
輸出大於long.MAX_VALUE且能被n整除的前3個數字,例以下列三個數能被17整除且大於long.MAX_VALUE: 922337203685477581692233720368547758339223372036854775850
輸入樣例:
103
輸出樣例:
9223372036854775832 9223372036854775935 9223372036854776038
解法:
方法一:
1 import java.math.BigInteger;
2 import java.util.Scanner;
3
4 public class Main4 {
5 public static void main(String[] args) throws InterruptedException {
6 BigInteger bigInteger = new BigInteger(String.valueOf(Long.MAX_VALUE));
7 int count = 1;
8 Scanner in = new Scanner(System.in);
9 int n = in.nextInt();
10 while (count <= 3) {
11 if (bigInteger.mod(BigInteger.valueOf(n)).intValue() == 0) {
12 System.out.println(bigInteger.toString());
13 count++;
14 }
15 bigInteger = bigInteger.add(BigInteger.valueOf(1));
16 }
17
18 }
19
20 }
View Code
方法 二:
1 import java.math.BigDecimal;
2 import java.util.Scanner;
3
4 public class Main {
5 public static void main(String[] args) throws InterruptedException {
6 BigDecimal bigDecimal = new BigDecimal(String.valueOf(Long.MAX_VALUE));
7 // valueOf()返回長參數的字符串表示形式
8 int count = 1;
9 Scanner in = new Scanner(System.in);
10 int n = in.nextInt();
11 while (count <= 3) {
12 if (bigDecimal.divideAndRemainder(BigDecimal.valueOf(n))[1].intValue() == 0) {
13 // intValue()將此BigInteger轉換爲int。
14 System.out.println(bigDecimal.toString());
15 // toString()返回此BigInteger的十進制String表示形式
16 count++;
17 }
18 bigDecimal = bigDecimal.add(BigDecimal.valueOf(1));
19 }
20 }
21 }
View Code
方法三:(優化)
1 import java.math.BigInteger;
2 import java.util.Scanner;
3
4 public class Main{
5 public static void main(String[] args) {
6 Scanner in = new Scanner(System.in);
7 BigInteger m = new BigInteger(Long.MAX_VALUE + "");
8 String s = in.next();
9 BigInteger n = new BigInteger(s);
10 BigInteger zero = new BigInteger("0");
11 m = m.add(BigInteger.ONE);
12 int count = 0;
13
14 while(count<3) {
15 if(division(m,n).compareTo(zero)==0) {
16 System.out.println(m);
17 count++;
18 }
19 m = m.add(BigInteger.ONE);
20 }
21 in.close();
22 }
23 public static BigInteger division(BigInteger m,BigInteger n) {
24 return m.divideAndRemainder(n)[1];
25 }
26 }
View Code
13.求幾何形狀的面積之和
(求幾何形狀的面積之和)編寫一個方法,求數組中全部幾何形狀對象的面積之和。方法簽名以下:
public static double sumArea(shape[] a)
編寫測試程序,繼承抽象類shape獲得圓形類Circle和矩形類Rectangle。
abstract class shape {// 抽象類
/ 抽象方法 求面積 /
public abstract double getArea();
/ 抽象方法 求周長 /
public abstract double getPerimeter();
}
建立四個對象(兩個圓和兩個矩形)的數組,而後使用sumArea方法求出它們的總面積。(保留4位小數)
輸入格式:
輸入 1.1 (第1個圓形的半徑) 1.8 (第2個圓形的半徑) 2.3 3.8 (第1個矩形的寬和高) 5.9 16.8 (第2個矩形的寬和高)
輸出格式:
The total area is 121.8401 (總面積,保留4位小數)
輸入樣例:
2.18 3.16 2.9 5.76 4.8 9.23
輸出樣例:
The total area is 107.3088
解法:
1 import java.util.Scanner;
2
3 abstract class shape {
4 public abstract double getArea();
5
6 public abstract double getPerimeter();
7 }
8
9 class Circle extends shape {
10 private double r;
11
12 public Circle(double r) {
13 this.r = r;
14 }
15
16 @Override
17 public double getArea() {
18 return Math.PI * r * r;
19 }
20
21 @Override
22 public double getPerimeter() {
23 return 2 * r * Math.PI;
24 }
25
26 }
27
28 class Rectangle extends shape {
29 private double side;
30 private double side1;
31
32 public Rectangle(double side, double side1) {
33 this.side = side;
34 this.side1 = side1;
35 }
36
37 @Override
38 public double getArea() {
39 return side * side1;
40 }
41
42 @Override
43 public double getPerimeter() {
44 return (side + side1) * 2;
45 }
46
47 }
48
49 public class Main {
50 public static double sumArea(shape[] a) {
51 double sum = 0;
52 for (int i = 0; i < a.length; i++) {
53 sum += a[i].getArea();
54 }
55 return sum;
56 }
57
58 public static void main(String[] args) {
59 Scanner in = new Scanner(System.in);
60 shape[] a = new shape[4];
61 double r = in.nextDouble();
62 a[0] = new Circle(r);
63 r = in.nextDouble();
64 a[1] = new Circle(r);
65
66 double w = in.nextDouble();
67 double h = in.nextDouble();
68 a[2] = new Rectangle(w, h);
69 w = in.nextDouble();
70 h = in.nextDouble();
71 a[3] = new Rectangle(w, h);
72
73 in.close();
74 System.out.println(String.format("The total area is " + "%.4f", sumArea(a)));
75
76 }
77 }
View Code
14.數字格式異常
(NumberFormatException數字格式異常)編寫一個程序,提示用戶讀取兩個整數,而後顯示他們的和。程序應該在輸入不正確時提示用戶再次輸入數字。
輸入格式:
i 9 (第1次輸入) l 8 (第2次輸入) 5 6 (第3次輸入)
輸出格式:
Incorrect input and re-enter two integers: (第1次輸出提示) Incorrect input and re-enter two integers: (第2次輸出提示) Sum is 11 (輸出結果)
輸入樣例:
i 9 l 8 5 6
輸出樣例:
Incorrect input and re-enter two integers: Incorrect input and re-enter two integers: Sum is 11
解法:
1 import java.util.InputMismatchException;
2 import java.util.Scanner;
3 import java.text.DecimalFormat;
4
5 public class Main {
6 public static void main(String[] args) {
7 Scanner in =new Scanner(System.in);
8 int m,n;
9 while(true){
10 try{
11 m=in.nextInt();
12 n=in.nextInt();
13 System.out.println("Sum is "+(m+n));
14 break;
15
16 }catch(InputMismatchException e){
17 System.out.println("Incorrect input and re-enter two integers:");
18 in.nextLine();
19 continue;
20 }
21 }
22 }
23 }
View Code
15.查找成績並折算後輸出
文件:期中考試成績.txt中有若干學生的姓名和數學期中考試成績。 Smith 67 Anderson 75 Lewis 83 Cook 58 David 96 請你編寫一個簡單的查詢成績程序,當從鍵盤輸入一個姓名時查找到他的數學期中考試分數並按照21%折算後輸出。若是沒找到則顯示Not found. 因爲目前的OJ系統暫時不能支持用戶讀入文件,咱們編寫程序從鍵盤輸入文件中的姓名和成績,當輸入的名字爲noname時,表示結束。noname後面有一個名字,須要查找其成績。
輸入格式:
Smith 67
Anderson 75
Lewis 83
Cook 58
David 96
noname (表示結束)
Bill
輸出格式:
Not found.
輸入樣例:
Smith 67 Anderson 75 Lewis 83 Cook 58 David 96 noname Lewis
輸出樣例:
17.43
源代碼:
方法一:
1 import java.util.HashMap;
2 import java.util.Map;
3 import java.util.Scanner;
4
5 public class Main {
6
7 public static void main(String[] args) {
8 Map<String,Double> phone = new HashMap<String,Double>();
9 Scanner in = new Scanner(System.in);
10 while(true) {
11 String name = in.next();
12 if(name.equals("noname")) {
13 break;
14 }
15 Double phoneNumber = in.nextDouble();
16 phone.put(name, phoneNumber);
17 }
18 String s = in.next();
19 if(!phone.containsKey(s)) {
20 System.out.println("Not Found。");
21 }
22 else{
23 System.out.println((phone.get(s))*0.21);
24 }
25 in.close();
26 }
27 }
View Code
方法二(優化):
1 import java.util.HashMap;
2 import java.util.Map;
3 import java.util.Scanner;
4
5
6 public class Main{
7 public static void main(String[] args){
8 Map<String, Integer> list=new HashMap<String, Integer>();
9 int a;
10 Scanner scanner=new Scanner(System.in);
11 String aString=scanner.next();
12
13 while(!aString.equals("noname"))
14 {
15 a=scanner.nextInt();
16
17 list.put(aString, a);
18 aString=scanner.next();
19
20 }
21 String string=scanner.next();
22 if(list.get(string) != null){
23 System.out.println(list.get(string)*0.21);
24 }
25
26 else {
27 System.out.println("Not found.");
28 }
29
30
31
32 }
33 }
View Code
23.找素數
請編寫程序,從鍵盤輸入兩個整數m,n,找出等於或大於m的前n個素數。
輸入格式:
第一個整數爲m,第二個整數爲n;中間使用空格隔開。例如:
103 3
輸出格式:
從小到大輸出找到的等於或大於m的n個素數,每一個一行。例如:
103
107
109
輸入樣例:
9223372036854775839 2
輸出樣例:
9223372036854775907 9223372036854775931
解法:
1 import java.math.BigInteger;
2 import java.util.Scanner;
3 public class Main {
4 public static void main(String[] args){
5 Scanner in = new Scanner(System.in);
6 BigInteger m;
7 int n;
8
9 m=in.nextBigInteger();
10 n=in.nextInt();
11 int cnt=0;
12 while (cnt<n){
13 if (m.isProbablePrime(100)){
14 System.out.println(m);
15 cnt++;
16 }
17 m=m.nextProbablePrime();
18 }
19 in.close();
20 }
21 }
View Code
24.計算正五邊形的面積和周長
從下列的抽象類shape類擴展出一個正五邊形(regular pentagon)類RPentagon,這個類將正五邊形的邊長做爲私有成員,類中包含初始化這個值的構造方法。public abstract class shape {// 抽象類/ 抽象方法 求面積 / public abstract double getArea();/ 抽象方法 求周長 / public abstract double getPerimeter(); }請編程從鍵盤輸入正五邊形的邊長值,建立一個正五邊形對象,而後輸出正五邊形的面積和正五邊形的周長。計算正五邊形的面積公式爲: S=5a^2/(4tan(36度))其中a爲邊長。 或者:S=(1/4)a^2√(25+10√5) 輸出結果保留4位小數。
輸入格式:
輸入正五邊形的邊長。例如:5
輸出格式:
輸出正五邊形的面積和周長。第一行輸出面積,第二行輸出周長。例如: 43.011925
輸入樣例:
16.8
輸出樣例:
485.5875 84
源代碼:
方法一:
1 import java.util.Scanner;
2 abstract class Shape{
3 abstract double getArea();
4 abstract double getPerimeter();
5 }
6 class RPentagon extends Shape{
7 private double a;
8 public RPentagon(double a){
9 this.a = a;
10 }
11 public double getArea(){
12 return 0.25*a*a*Math.sqrt(25+10*Math.sqrt(5));
13 }
14 public double getPerimeter() {
15 return 5*a;
16 }
17
18 }
19 public class Main {
20
21 public static void main(String[] args) {
22 Scanner in = new Scanner(System.in);
23 double b=in.nextDouble();
24 RPentagon r= new RPentagon(b);
25 System.out.println(String.format("%.4f",r.getArea()));
26 System.out.println((int)r.getPerimeter());
27 }
28
29 }
View Code
方法二:(優化)
1 import java.lang.Math;
2 import java.math.BigDecimal;
3 import java.text.DecimalFormat;
4 import java.util.Scanner;
5 public class Main {
6 public static void main(String[] args){
7 Scanner in=new Scanner(System.in);
8 double a=in.nextDouble();
9 Bian b1=new Bian(a);
10
11 DecimalFormat df1 = new DecimalFormat("#.####");
12 System.out.println(df1.format(b1.getArea()));
13 System.out.println(df1.format(b1.getPerimeter()));
14 }
15 }
16 abstract class shape{// 抽象類
17 public abstract double getArea();
18 public abstract double getPerimeter();
19 }
20 class Bian extends shape{
21 private double a;
22 public Bian(double a){
23 this.a=a;
24 }
25 public double getArea(){
26 double s=a*a/4*(Math.sqrt(25+10*Math.sqrt(5.0)));
27 //BigDecimal s1=new BigDecimal(s);
28 //double s2=s1.setScale(4,BigDecimal.ROUND_HALF_UP).doubleValue();
29 return s;
30 }
31 public double getPerimeter(){
32 return a*5;
33 }
34 }
View Code
25.求階乘factorial
編程從鍵盤輸入一個整數,計算出階乘並輸出。
輸入格式:
輸出格式:
輸出:20397882081197443358640281739902897356800000000
輸入樣例:
輸出樣例:
2350561331282878571829474910515074683828862318181142924420699914240000000000000
解法:
1 import java.math.BigInteger;
2 import java.util.Scanner;
3
4 public class Main {
5 public static void main(String args[]) {
6 BigInteger sum = new BigInteger("1");
7 Scanner in = new Scanner(System.in);
8 int n = in.nextInt();
9 for(int i = 1; i<= n;i++){
10 String temp1 = Integer.toString(i);
11 BigInteger temp2 = new BigInteger(temp1);
12 sum = sum.multiply(temp2);
13 }
14 System.out.println(sum);
15
16 }
17 }
View Code
26 .字符串替換
將文本文件中指定的字符串替換成新字符串。 因爲目前的OJ系統暫時不能支持用戶讀入文件,咱們編寫程序從鍵盤輸入文件中的內容,當輸入的一行爲end時,表示結束。end後面有兩個字符串,要求用第二個字符串替換文本中全部的第一個字符串。
輸入格式:
Xi’an Institute of Posts and Telecommunications is co-designed and implemented by the People’s Government of Shaanxi Province and the Ministry of Industry and Information Technology. The Institute is located in Xi’an, a historic city in Northwest China, famous for its magnificent ancient culture.
end (表示結束)
Institute (第一個字符串,要求用第二個字符串替換)
University (第二個字符串)
輸出格式:
Xi’an University of Posts and Telecommunications is co-designed and implemented by the People’s Government of Shaanxi Province and the Ministry of Industry and Information Technology.The University is located in Xi’an, a historic city in Northwest China, famous for its magnificent ancient culture.
輸入樣例:
Xi’an Institute of Posts and Telecommunications is co-designed and implemented by the People’s Government of Shaanxi Province and the Ministry of Industry and Information Technology.
The Institute is located in Xi’an, a historic city in Northwest China, famous for its magnificent ancient culture.
end
Institute
University
輸出樣例:
Xi’an University of Posts and Telecommunications is co-designed and implemented by the People’s Government of Shaanxi Province and the Ministry of Industry and Information Technology.The University is located in Xi’an, a historic city in Northwest China, famous for its magnificent ancient culture.
解法:
1 import java.io.*;
2 import java.util.*;
3
4 public class Main{
5 public static void main(String[] args) throws IOException {
6 String x = null;
7 Scanner in = new Scanner(System.in);
8 String str = "";
9 x = in.nextLine();
10 while (!x.equals("end")) {
11 str += x;
12 x = in.nextLine();
13 }
14 String a = in.nextLine();
15 String b = in.nextLine();
16 in.close();
17 String str1 = str.replace(a, b+" ");
18 System.out.println(str1);
19
20 }
21 }
View Code
27.找出最大的對象
(找出最大的對象)編寫一個方法,返回對象數組中最大的對象。方法簽名以下:public static Object max(Comparable[] a)全部對象都是Comparable接口的實例。對象在數組中的順序是由compareTo方法決定的。編寫測試程序,從鍵盤輸入5個字符串和5個整數,建立一個由5個字符串構成的數組、一個由5個整數構成的數組。找出數組中最大的字符串、整數並輸出。
輸入格式:
1 輸入
2
3 Xi'an (輸入5個字符串,每行一個)
4
5 Beijing
6
7 ShangHai
8
9 GuangZhou
10
11 ShenZhen
12
13 8 9 12 7 6 (輸入5個整數,以空格分隔)
View Code
輸出格式:
輸出 Max string is Xi'an (輸出最大的字符串)
Max integer is 12 (輸出最大的整數)
輸入樣例:
1 France
2 Japan
3 German
4 China
5 India
6 6 34 89 168 53
View Code
輸出樣例:
Max string is Japan
Max integer is 168
解法:
1 import java.util.Arrays;
2 import java.util.Scanner;
3 public class Main {
4
5 public static void main(String[] args) {
6 @SuppressWarnings("resource")
7 Scanner sc = new Scanner(System.in);
8 String [] list1 = new String[5];
9 int [] list2 = new int[5];
10 for(int i=0;i<5;i++){
11 String str1 = sc.next();
12 list1[i]=str1;
13 }
14 for(int i=0;i<5;i++){
15 int str2 = sc.nextInt();
16 list2[i]=str2;
17 }
18
19
20 Arrays.sort(list1);
21 Arrays.sort(list2);
22 System.out.println("Max string is "+list1[4]);
23 System.out.println("Max integer is "+list2[4]);
24 }
25 }
View Code
28. 給定兩個點的座標,求解兩個點的距離。
輸入格式:
給定四個浮點數,做爲線段的兩個點。
輸出格式:
輸出該線段的距離。
輸入樣例:
輸出樣例:
解法:
1 import java.util.Scanner;
2
3 public class Main{
4
5 public static void main(String[] args) {
6 Scanner in = new Scanner(System.in);
7 double a1 = in.nextDouble();
8 double a2 = in.nextDouble();
9 double a3 = in.nextDouble();
10 double a4 = in.nextDouble();
11 double s = Math.sqrt(Math.pow((a3-a1), 2)+Math.pow((a3-a1),2));
12 System.out.println(String.format("The distance is "+"%.2f", s));
13
14 }
15
16 }
View Code
29.檢驗密碼
一些網站設定了一些制定密碼的規則。編寫一個方法,檢驗一個字符串是否合法的密碼。假設密碼規則以下: 密碼必須至少有8個字符。 密碼只能包含字母和數字。 密碼必須至少有2個數字。 請編寫一個程序,提示用戶輸入密碼,若是改密碼符合規則就顯示「Valid password」,不然顯示「Invalid password」
解法:
1 public class Main{
2 @SuppressWarnings("resource")
3 public static void main(String[] args) {
4 // Prompt the user to enter a password
5 java.util.Scanner input = new java.util.Scanner(System.in);
6 //System.out.print("Enter a string for password: ");
7 String s = input.nextLine();
8
9 if (isValidPassword(s) == true) {//第一個空格
10 System.out.println("Valid password");
11 }
12 else {
13 System.out.println("Invalid password");
14 }
15 }
16
17 /** 檢查字符串是不是有效的密碼 */
18 public static boolean isValidPassword(String s) {
19 // 只有數字和字母?charAt(i)(數字判斷)
20 for (int i = 0; i < s.length(); i++) {
21 if (!Character.isLetter(s.charAt(i)) && !Character.isDigit(s.charAt(i)))//第二個空格
22 return false;
23 }
24
25 // 檢查長度
26 if (s.length() < 8)//第三個空格
27 return false;
28
29 // 計數位數
30 int count = 0;
31 for (int i = 0; i < s.length(); i++) {
32 if (Character.isDigit(s.charAt(i)))
33 count++;
34 }
35
36 if (count >= 2)//第四個空格
37 return true;
38 else
39 return false;
40 }
41 }
View Code
30.二位數組排序
在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序,請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否有該整數。
1 #include <stdio.h>
2 #include<stdbool.h>
3 int main()
4 {
5 int find(int matrix[4][4], int rows, int columns, int number);
6 int a[4][4] = {{ 1, 2, 8, 9 },
7 { 2, 4, 9, 12 },
8 { 4, 7, 10, 13 },
9 { 6, 8, 11, 15 } };
10 int result = find(a, 4, 4, 12);
11 if (result == 1)
12 printf("已經查到\n");
13 else
14 printf("數組中沒有此元素\n");
15 return 0;
16 }
17 int find(int matrix[4][4], int rows, int columns, int number)
18 {
19 bool found = false;
20 if (matrix != NULL && rows>0 && columns>0)
21 {
22 int a = 0;
23 int b = columns - 1;
24 while (a<rows && b >= 0)
25 {
26 if (matrix[a][b] == number)
27 {
28 found = true;
29 break;
30 }
31 else if (matrix[a][b]> number)
32 --b;
33 else
34 ++a;
35 }
36 }
37 return found;
38 }
View Code
31.打印矩陣
輸入一個矩陣,按照從裏向外的順序依次打印出每個數字。
代碼:
1 #include <cstdio>
2
3 void PrintMatrixInCircle(int** numbers, int columns, int rows, int start);
4 void printNumber(int number);
5
6 void PrintMatrixClockwisely(int** numbers, int columns, int rows)
7 {
8 if (numbers == nullptr || columns <= 0 || rows <= 0)
9 return;
10
11 int start = 0;
12
13 while (columns > start * 2 && rows > start * 2)
14 {
15 PrintMatrixInCircle(numbers, columns, rows, start);
16
17 ++start;
18 }
19 }
20
21 void PrintMatrixInCircle(int** numbers, int columns, int rows, int start)
22 {
23 int endX = columns - 1 - start;
24 int endY = rows - 1 - start;
25
26 // 從左到右打印一行
27 for (int i = start; i <= endX; ++i)
28 {
29 int number = numbers[start][i];
30 printNumber(number);
31 }
32
33 // 從上到下打印一列
34 if (start < endY)
35 {
36 for (int i = start + 1; i <= endY; ++i)
37 {
38 int number = numbers[i][endX];
39 printNumber(number);
40 }
41 }
42
43 // 從右到左打印一行
44 if (start < endX && start < endY)
45 {
46 for (int i = endX - 1; i >= start; --i)
47 {
48 int number = numbers[endY][i];
49 printNumber(number);
50 }
51 }
52
53 // 從下到上打印一行
54 if (start < endX && start < endY - 1)
55 {
56 for (int i = endY - 1; i >= start + 1; --i)
57 {
58 int number = numbers[i][start];
59 printNumber(number);
60 }
61 }
62 }
63
64 void printNumber(int number)
65 {
66 printf("%d\t", number);
67 }
68
69 // ====================測試代碼====================
70 void Test(int columns, int rows)
71 {
72 printf("Test Begin: %d columns, %d rows.\n", columns, rows);
73
74 if (columns < 1 || rows < 1)
75 return;
76
77 int** numbers = new int*[rows];
78 for (int i = 0; i < rows; ++i)
79 {
80 numbers[i] = new int[columns];
81 for (int j = 0; j < columns; ++j)
82 {
83 numbers[i][j] = i * columns + j + 1;
84 }
85 }
86
87 PrintMatrixClockwisely(numbers, columns, rows);
88 printf("\n");
89
90 for (int i = 0; i < rows; ++i)
91 delete[](int*)numbers[i];
92
93 delete[] numbers;
94 }
95
96 int main(int argc, char* argv[])
97 {
98 /*
99 1
100 */
101 Test(1, 1);
102
103 /*
104 1 2
105 3 4
106 */
107 Test(2, 2);
108
109 /*
110 1 2 3 4
111 5 6 7 8
112 9 10 11 12
113 13 14 15 16
114 */
115 Test(4, 4);
116
117 /*
118 1 2 3 4 5
119 6 7 8 9 10
120 11 12 13 14 15
121 16 17 18 19 20
122 21 22 23 24 25
123 */
124 Test(5, 5);
125
126 /*
127 1
128 2
129 3
130 4
131 5
132 */
133 Test(1, 5);
134
135 /*
136 1 2
137 3 4
138 5 6
139 7 8
140 9 10
141 */
142 Test(2, 5);
143
144 /*
145 1 2 3
146 4 5 6
147 7 8 9
148 10 11 12
149 13 14 15
150 */
151 Test(3, 5);
152
153 /*
154 1 2 3 4
155 5 6 7 8
156 9 10 11 12
157 13 14 15 16
158 17 18 19 20
159 */
160 Test(4, 5);
161
162 /*
163 1 2 3 4 5
164 */
165 Test(5, 1);
166
167 /*
168 1 2 3 4 5
169 6 7 8 9 10
170 */
171 Test(5, 2);
172
173 /*
174 1 2 3 4 5
175 6 7 8 9 10
176 11 12 13 14 15
177 */
178 Test(5, 3);
179
180 /*
181 1 2 3 4 5
182 6 7 8 9 10
183 11 12 13 14 15
184 16 17 18 19 20
185 */
186 Test(5, 4);
187
188 return 0;
189 }
View Code
32.輸出二叉樹的鏡像
代碼:
1 #include<stdio.h>
2 #include<stdlib.h>
3 typedef struct node
4 {
5 char value;
6 struct node *lchild;
7 struct node *rchild;
8 }TreeNode,*Tree;
9 //頭插法建立二叉樹
10 Tree CreateTree(Tree &t)
11 {
12 char ch;
13 scanf_s("%c", &ch);
14 if (ch == '#')
15 t = NULL;
16 else
17 {
18 t = (Tree)malloc(sizeof(TreeNode));
19 if (!t)
20 {
21 printf("分配內存出錯!");
22 return NULL;
23 }
24 t->value = ch;
25 CreateTree(t->lchild);
26 CreateTree(t->rchild);
27 }
28 return t;
29 }
30 //求二叉樹鏡像
31 void MirrorRecursively(Tree pNpde)
32 {
33 if (pNpde == NULL)
34 return ;
35 if (pNpde->lchild == NULL && pNpde->rchild == NULL)
36 return ;
37 Tree pTemp = pNpde->lchild;
38 pNpde->lchild = pNpde->rchild;
39 pNpde->rchild = pTemp;
40 if (pNpde->lchild)
41 MirrorRecursively(pNpde->lchild);
42 if (pNpde->rchild)
43 MirrorRecursively(pNpde->rchild);
44 }
45 //先序遞歸遍歷
46 void PreOrder(Tree T)
47 {
48 if (T)
49 {
50 printf("%c",T->value);
51 PreOrder(T->lchild);
52 PreOrder(T->rchild);
53 }
54 }
55 int main()
56 {
57 Tree T;
58 printf("建立二叉樹,‘#’表明空:");
59 CreateTree(T);
60 printf("先序遍歷二叉樹:");
61 PreOrder(T);
62 MirrorRecursively(T);
63 if (T)
64 {
65 printf("\n先序遍歷鏡像二叉樹: ");
66 PreOrder(T);
67 }
68 else
69 printf("建立的樹爲空");
70 printf("\n");
71 return 0;
72 }
73 /*
74 建立二叉樹,‘#’表明空:ABD##E##CF##G##
75 先序遍歷二叉樹:ABDECFG
76 先序遍歷鏡像二叉樹: ACGFBED
77 請按任意鍵繼續. . .
78
79 建立二叉樹,‘#’表明空:#
80 先序遍歷二叉樹:建立的樹爲空
81 請按任意鍵繼續. . .
82
83 */
View Code
33.判斷兩顆二叉樹B是否是A的子結構。
代碼:
1 #include<stdio.h>
2 #include<stdlib.h>
3 typedef char ElemType;
4 //樹結構
5 typedef struct tree
6 {
7 ElemType data;
8 struct tree * lchild;
9 struct tree * rchild;
10 }TreeNode, *Tree;
11
12 Tree CreateTree(Tree &t)
13 {
14 char ch;
15 scanf_s("%c", &ch);
16 if (ch == '#')
17 t = NULL;
18 else
19 {
20 t = (Tree)malloc(sizeof(TreeNode));
21 if (!t)
22 {
23 printf("分配內存出錯!");
24 return NULL;
25 }
26 t->data = ch;
27 CreateTree(t->lchild);
28 CreateTree(t->rchild);
29 }
30 return t;
31 }
32 bool DoedTreeHaveTree(Tree pRoot1,Tree pRoot2)
33 {
34 if (pRoot2 == NULL)
35 return true;
36 if (pRoot1 == NULL)
37 return false;
38 if (pRoot1->data != pRoot2->data)
39 return false;
40 return DoedTreeHaveTree(pRoot1->lchild, pRoot2->lchild) && DoedTreeHaveTree(pRoot1->rchild,pRoot2->rchild);
41 }
42 bool HasSubtree(Tree pRoot1,Tree pRoot2)
43 {
44 bool result = false;
45 if (pRoot1 != NULL && pRoot2 != NULL)
46 {
47 if (pRoot1->data == pRoot2->data)
48 result = DoedTreeHaveTree(pRoot1,pRoot2);
49 if (!result)
50 result = HasSubtree(pRoot1->lchild,pRoot2);
51 if (!result)
52 result = HasSubtree(pRoot1->rchild,pRoot2);
53 }
54 return result;
55 }
56 int main()
57 {
58 Tree T1 = (Tree)malloc(sizeof(TreeNode));
59 bool result=false;
60 printf("\n按先序序列輸入A樹結點序列,'#'表明空:");
61 T1=CreateTree(T1);
62 fflush(stdin); //清除緩存,此語句很重要
63 Tree T2 = (Tree)malloc(sizeof(TreeNode));
64 printf("\n按先序序列輸入B樹結點序列,'#'表明空:");
65 T2 = CreateTree(T2);
66 result = HasSubtree(T1,T2);
67 printf("\n");
68 if (result == true)
69 printf("B是A的子結構\n\n");
70 else
71 printf("B不是A的子結構\n\n");
72 return 0;
73 }
74
75
76 結果以下:
77 按先序序列輸入A樹結點序列,'#'表明空:ABD##EF##G##C##
78 按先序序列輸入B樹結點序列,'#'表明空:BD##E##
79 B是A的子結構
80 請按任意鍵繼續. . .
81
82 按先序序列輸入A樹結點序列,'#'表明空:ABD##EF##G##C##
83 按先序序列輸入B樹結點序列,'#'表明空:#
84 B不是A的子結構
85 請按任意鍵繼續. . .
86
87 按先序序列輸入A樹結點序列,'#'表明空:#
88 按先序序列輸入B樹結點序列,'#'表明空:BD##E##
89 B不是A的子結構
90 請按任意鍵繼續. . .
91
92 按先序序列輸入A樹結點序列,'#'表明空:ABD##EF##G##C##
93 按先序序列輸入B樹結點序列,'#'表明空:fq##n##
94 B不是A的子結構
95 請按任意鍵繼續. . .
96
97
98 按先序序列輸入A樹結點序列,'#'表明空:ABD##EF##G##C##
99 按先序序列輸入B樹結點序列,'#'表明空:A##
100 B是A的子結構
101 請按任意鍵繼續. . .
View Code
34. 合併兩個遞增鏈表使新的鏈表結點按照遞增排序。
代碼:
1 #include<stdio.h>
2 #include"malloc.h"
3 typedef struct node
4 {
5 struct node *next;
6 int data;
7 }*ListNode;
8
9 //尾插法建立鏈表(不帶頭結點)
10 ListNode creatrList()
11 {
12 ListNode p = (ListNode)malloc(sizeof(ListNode));
13 ListNode s, q;
14 p->next = NULL;
15 q = p;
16 int x = 0;
17 scanf_s("%d", &x);
18 while (x != -1)
19 {
20 s = (ListNode)malloc(sizeof(ListNode));
21 s->next = NULL;
22 p->data = x;
23 p->next = s;
24 p = s;
25 scanf_s("%d", &x);
26 }
27 return q;
28 }
29 //合併兩個鏈表
30 ListNode Merge(ListNode AList,ListNode BList)
31 {
32 if (AList->next == NULL)
33 return BList;
34 else if (BList->next == NULL)
35 return AList;
36 ListNode CList = NULL;
37 if (AList->data < BList->data)
38 {
39 CList = AList;
40 CList->next = Merge(AList->next,BList);
41 }
42 else
43 {
44 CList = BList;
45 CList->next = Merge(AList, BList->next);
46 }
47 return CList;
48 }
49
50 int main()
51 {
52 ListNode AList, BList,CList;
53 printf("建立A鏈表,以-1結束:");
54 AList = creatrList();
55 printf("建立B鏈表,以-1結束:");
56 BList = creatrList();
57 CList = Merge(AList, BList);
58 printf("合併後的列表爲:");
59 while (CList->next!=NULL)
60 {
61 printf("%3d",CList->data);
62 CList = CList->next;
63 }
64 printf("\n");
65 return 0;
66
67 }
68 /*
69 建立A鏈表,以-1結束:1 2 3 5 6 7 -1
70 建立B鏈表,以-1結束:8 9 11 14 16 19 21 23 25 27 -1
71 合併後的列表爲: 1 2 3 5 6 7 8 9 11 14 16 19 21 23 25 27
72 請按任意鍵繼續. . .
73
74 建立A鏈表,以-1結束:-1
75 建立B鏈表,以-1結束:1 2 3 4 5 6 7 8 -1
76 合併後的列表爲: 1 2 3 4 5 6 7 8
77 請按任意鍵繼續. . .
78
79 建立A鏈表,以-1結束:1 2 3 4 5 6 7 8 -1
80 建立B鏈表,以-1結束:1 2 3 4 5 6 7 8 -1
81 合併後的列表爲: 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8
82 請按任意鍵繼續. . .
83
84
85 */
View Code
35. 輸入一個鏈表的頭結點,反轉該鏈表並輸出反轉後鏈表的頭結點。
代碼:
1 #include<stdio.h>
2 #include"malloc.h"
3 typedef struct node
4 {
5 struct node *next;
6 int data;
7 }*ListNode;
8
9 //尾插法建立鏈表(不帶頭結點)
10 ListNode creatrList()
11 {
12 ListNode p = (ListNode)malloc(sizeof(ListNode));
13 ListNode s,q;
14 p ->next = NULL;
15 q = p;
16 int x=0;
17 printf("建立鏈表,以-1結束:");
18 scanf_s("%d", &x);
19 while (x!=-1)
20 {
21 s = (ListNode)malloc(sizeof(ListNode));
22 s->next = NULL;
23 p->data = x;
24 p->next = s;
25 p = s;
26 scanf_s("%d", &x);
27 }
28 return q;
29 }
30 //反轉鏈表
31 ListNode ReverseList(ListNode pHead)
32 {
33 ListNode prev = NULL;
34 ListNode pNode = pHead;
35 ListNode ReverPHead=NULL;
36 while (pNode != NULL)
37 {
38 ListNode pNext = pNode->next;
39 if (pNext == NULL)
40 ReverPHead = pNode;
41 pNode->next = prev;
42 prev = pNode;
43 pNode = pNext;
44 }
45 printf("%d",ReverPHead->data);
46 return ReverPHead;
47 }
48
49 int main()
50 {
51 ListNode h,RH;
52 h = creatrList();
53
54 RH=ReverseList(h);
55 if (RH->next == NULL)
56 printf("鏈表爲空\n");
57 else
58 {
59 RH = RH->next;
60 while (RH != NULL)
61 {
62 printf("%3d", RH->data);
63 RH = RH->next;
64 }
65 printf("\n");
66 }
67 return 0;
68
69 }
70 /*
71 建立鏈表,以-1結束:1 2 3 4 5 6 -1
72 6 5 4 3 2 1
73 請按任意鍵繼續. . .
74
75 建立鏈表,以-1結束:-1
76 鏈表爲空
77 請按任意鍵繼續. . .
78
79 建立鏈表,以-1結束:4 -1
80 4
81 請按任意鍵繼續. . .
82 */
View Code
46.輸出鏈表中倒數第k個結點,鏈表從1開始計數吧,即鏈表的尾結點是倒數第1個結點。
要求:只能遍歷一次鏈表找到k結點。
代碼:
1 #include<stdio.h>
2 #include"malloc.h"
3 typedef struct node
4 {
5 int value;
6 struct node *next;
7 }*ListNode;
8
9 ListNode createList()
10 {
11 ListNode H = (ListNode)malloc(sizeof(ListNode));
12 H->next = NULL;
13 ListNode r, s;
14 r = H;
15 int x;
16 printf("建立鏈表,輸入整數,以-1結束:");
17 scanf_s("%d",&x);
18 while (x != -1)
19 {
20 s = (ListNode)malloc(sizeof(ListNode));
21 s->value = x;
22 s->next = r->next;
23 r->next = s;
24 r = s;
25 scanf_s("%d", &x);
26 }
27 return H;
28 }
29
30 ListNode FindKToTail(ListNode H, unsigned int k)
31 {
32 //若是鏈表爲空或k等於0,返回NULL
33 if (H->next == NULL || k == 0)
34 return NULL;
35 ListNode pBegin=H->next;
36 ListNode pEnd=NULL;
37 for (unsigned int i = 0; i < k - 1;i++)
38 {
39 if (pBegin->next != NULL)
40 pBegin = pBegin->next;
41 else
42 {
43 return NULL; //若是鏈表的長度小於K,返回NULL
44 }
45 }
46 pEnd = H->next;
47 while (pBegin->next !=NULL)
48 {
49 pBegin = pBegin->next;
50 pEnd = pEnd->next;
51 }
52 return pEnd;
53 }
54 int main()
55 {
56 ListNode H,p,q;
57 unsigned int k = 0;
58 H = createList();
59 p = H->next;
60 printf("建立的鏈表爲:");
61 while (p!=NULL)
62 {
63 printf("%3d",p->value);
64 p = p->next;
65 }
66 printf("\n");
67 printf("鏈表建立完成,輸入要查找的倒數位置:");
68 scanf_s("%d", &k);
69 q = FindKToTail(H,k);
70 if (q == NULL)
71 printf("鏈表爲空或k大於鏈表的長度\n");
72 else
73 printf("倒數第 %d 個位置的值爲 %d\n",k,q->value);
74
75 return 0;
76 }
77
78 /*
79 建立鏈表,輸入整數,以-1結束:1 2 3 4 5 6 7 8 9 10 -1
80 建立的鏈表爲: 1 2 3 4 5 6 7 8 9 10
81 鏈表建立完成,輸入要查找的倒數位置:5
82 倒數第 5 個位置的值爲 6
83 請按任意鍵繼續. . .
84
85 建立鏈表,輸入整數,以-1結束:-1
86 建立的鏈表爲:
87 鏈表建立完成,輸入要查找的倒數位置:0
88 鏈表爲空或k大於鏈表的長度
89 請按任意鍵繼續. . .
90
91 建立鏈表,輸入整數,以-1結束:1 2 3 -1
92 建立的鏈表爲: 1 2 3
93 鏈表建立完成,輸入要查找的倒數位置:5
94 鏈表爲空或k大於鏈表的長度
95 請按任意鍵繼續. . .
96
97
98 */
View Code
47.調整數組
輸入一個整數數組,實現一個函數來調整該數組中的數字,使得全部奇數位於數組的前半部分,全部的偶數位於 數組的後半部分。
代碼:
1 #include<stdio.h>
2 bool isEven(int n)
3 {
4 return (n & 1) == 0;
5 }
6 void Reorder(int *pData, unsigned int length, bool(*func)(int))
7 {
8 if (pData == NULL || length == 0)
9 return;
10 int *pBegin = pData;
11 int *pEnd = pData + length - 1;
12 while (pBegin < pEnd)
13 {
14 while (pBegin < pEnd && !func(*pBegin)) //若是前面的指針指向的數字是奇數
15 pBegin++;
16 while (pBegin < pEnd && func(*pEnd)) //若是後面的指針指向的數字是偶數
17 pEnd--;
18 if (pBegin < pEnd)
19 {
20 int temp = *pBegin;
21 *pBegin = *pEnd;
22 *pEnd = temp;
23 }
24 }
25
26 }
27 int main()
28 {
29 int a[8] = { 5, 1, 6, 2, 3, 7, 8, 10 };
30 Reorder(a,8,isEven);
31 for (int i = 0; i < 8; i++)
32 printf("%3d",a[i]);
33 printf("\n");
34 return 0;
35 }
36 /*
37 5 1 7 3 2 6 8 10
38 請按任意鍵繼續. . .
39
40 */
View Code
48.刪除鏈表指定節點
在給定單鏈表的頭結點指針和一個結點指針,定義一個函數在O(1)時間刪除該結點。
代碼:
1 #include <stdio.h>
2 #include "malloc.h"
3 struct ListNode
4 {
5 int value;
6 ListNode *next;
7 };
8 //尾插法建立鏈表
9 ListNode *createList()
10 {
11 ListNode *H = (ListNode *)malloc(sizeof(ListNode));
12 H->next = NULL;
13 ListNode *s, *r = H; //r指向尾節點,s爲要插入的結點
14 int x;
15 scanf_s("%d",&x);
16 while (x!=-1)
17 {
18 s = (ListNode *)malloc(sizeof(ListNode));
19 s->value = x;
20 s->next = r->next;
21 r->next = s;
22 r = s;
23 scanf_s("%d", &x);
24 }
25 return H;
26 }
27 void DeleteNode(ListNode **pListHead,ListNode *pToDelete)
28 {
29 if (pListHead == NULL || *pListHead == NULL || pToDelete == NULL)
30 return;
31 //要刪除的結點不是尾結點,將須要刪除的結點後面的結點覆蓋到要刪除的結點,將後面的結點刪除
32 if (pToDelete->next != NULL)
33 {
34 ListNode *pNode = pToDelete->next;
35 pToDelete->value = pNode->value;
36 pToDelete->next = pNode->next;
37 delete pNode;
38 pNode = NULL;
39 }
40 //鏈表中只有一個結點,刪除頭結點(也是尾結點)
41 else if (*pListHead == pToDelete)
42 {
43 delete pToDelete;
44 pToDelete = NULL;
45 pListHead = NULL;
46 }
47 //鏈表中有多個結點,要刪除的結點在尾部,須要找到刪除結點的前一個結點(常規方法)
48 else
49 {
50 ListNode *pNodes = *pListHead;
51 while (pNodes->next != pToDelete)
52 {
53 pNodes = pNodes->next;
54 }
55 pNodes->next = NULL;
56 delete pToDelete;
57 pToDelete = NULL;
58 }
59 }
60 ListNode *find(ListNode *list, int x)
61 {
62 ListNode *fq;
63 fq = list->next;
64 if (fq == NULL)
65 return NULL;
66 while (fq != NULL)
67 {
68 if (fq->value == x)
69 return fq;
70 fq = fq->next;
71 }
72 return NULL;
73 }
74
75 int main()
76 {
77 int x;
78 ListNode *p,*q;
79 ListNode *H = (ListNode *)malloc(sizeof(ListNode));
80 printf("輸入單鏈表的結點值,以-1結束:");
81 H = createList();
82 printf("輸入要刪除的結點的值:");
83 scanf_s("%d",&x);
84 q = find(H,x);
85 DeleteNode(&H,q);
86 p = H->next;
87 printf("刪除一個結點%d後的值爲 :",x);
88 while (p != NULL)
89 {
90 printf("%3d",p->value);
91 p = p->next;
92 }
93 printf("\n");
94
95 return 0;
96 }
97
98 /*
99 輸入單鏈表的結點值,以-1結束:1 2 3 4 5 6 -1
100 輸入要刪除的結點的值:1
101 刪除一個結點1後的值爲 : 2 3 4 5 6
102 請按任意鍵繼續. . .
103
104 輸入單鏈表的結點值,以-1結束:1 2 3 4 5 6 -1
105 輸入要刪除的結點的值:3
106 刪除一個結點3後的值爲 : 1 2 4 5 6
107 請按任意鍵繼續. . .
108
109 輸入單鏈表的結點值,以-1結束:1 2 3 4 5 6 -1
110 輸入要刪除的結點的值:6
111 刪除一個結點6後的值爲 : 1 2 3 4 5
112 請按任意鍵繼續. . .
113 */
View Code
49. 不使用庫函數求次方
實現函數double Power(double base,int exponent),求base的exponent次方,不得使用庫函數,同時不須要考慮大數問題。
首先,對於此題目,能夠考慮如下幾種狀況:
1.當次數爲負數且底數爲0的時候,是沒有意義的;
2.當底數爲0,次數也爲0的時候,也是沒有意義的,能夠輸出1或0;
3.其餘狀況
代碼:
1 #include <stdio.h>
2 bool g_InvalidInput = false; //當出錯時,這個變量爲true,不然爲false,這樣能夠把返回值直接傳給其餘變量
3 //比較兩個數是否相等
4 bool equal(double num1,double num2)
5 {
6 if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
7 return true;
8 else
9 return false;
10 }
11
12 double PowerWithUnsignedExponent(double base,unsigned int exponent)
13 {
14 double result = 1.0;
15 for (int i = 1; i <= exponent; i++)
16 result *= base;
17 return result;
18 }
19 double power(double base, int exponent)
20 {
21 g_InvalidInput = false;
22 if (equal(base, 0.0) && exponent < 0){
23 g_InvalidInput = true; //出錯時,g_InvalidInput = false;
24 return 0.0;
25 }
26 unsigned int absExponent = (unsigned int )(exponent);
27 if (exponent < 0)
28 absExponent = (unsigned int)(-exponent);
29 double result = PowerWithUnsignedExponent(base,absExponent);
30 if (exponent < 0)
31 result = 1.0 / result; //指數爲負數,對結果求倒數
32 return result;
33 }
34 int main()
35 {
36 double base, exponent;
37 scanf_s("%lf", &base);
38 scanf_s("%lf", &exponent);
39 printf("%lf\n", power(base, exponent));
40 return 0;
41 }
42 /*
43 2.0 3.0
44 8.000000
45 請按任意鍵繼續. . .
46
47 2.0 -3.0
48 0.125000
49 請按任意鍵繼續. . .
50
51 0 0
52 1.000000
53 請按任意鍵繼續. . .
54
55 */
View Code
PowerWithUnsignedExponent方法改進:
即利用公式
a^n = a^(n/2) * a^(n/2) n爲偶數
a^n = a^((n-1)/2) * a^((n-1)/2) * a n爲奇數
代碼:
1 double PowerWithUnsignedExponent(double base, unsigned int exponent)
2 {
3 if (exponent == 0)
4 return 1;
5 if (exponent == 1)
6 return base;
7 double result = PowerWithUnsignedExponent1(base, exponent >> 1);
8 result *= result;
9 if (exponent & 0x1 == 1)
10 result *= base;
11 return result;
12 }
View Code
50.輸出指定數字中的二進制表示形式中1的個數
實現一個函數,輸入一個整數,輸出該數的二進制表示形式中1的個數,;例如把9表示成二進制是1001,有2位是1,所以若是輸入9,改函數輸出2.
代碼:
1 #include<stdio.h>
2 //二進制中1的個數解法一:爲了不死循環,首先把n和1作與運算,判斷n最低位是否是1,接着把1
3 //左移一位獲得2,再和n作與運算,整數中有多少位,就須要循環多少次
4 //
5 int NumberOf1(int n)
6 {
7 int count = 0;
8 unsigned int flag = 1;
9 while (flag)
10 {
11 if (n & flag)
12 count++;
13 flag = flag << 1;
14 }
15 return count;
16
17 }
18 //解法二:把一個整數減去1再和原來的整數作與運算,就會把該整數的二進制表示形式中最右邊的1變成0,那麼,一個整數中有多少個1就須要循環多少次
19 int NumberOf2(int n)
20 {
21 int count = 0;
22 while (n)
23 {
24 ++count;
25 n = (n - 1)& n;
26 }
27 return count;
28 }
29 int main()
30 {
31 int n;
32 scanf_s("%d", &n);
33 printf("解法一:該整數表示成二進制的形式中1 的個數爲:%d\n", NumberOf1(n));
34 printf("解法二:該整數表示成二進制的形式中1 的個數爲:%d\n", NumberOf2(n));
35 return 0;
36 }
37 /*
38 7
39 解法一:該整數表示成二進制的形式中1 的個數爲:3
40 解法二:該整數表示成二進制的形式中1 的個數爲:3
41 請按任意鍵繼續. . .
42
43 */
View Code
51.把一個數組最開始的若干各元素搬到數組的末尾
把一個數組最開始的若干各元素搬到數組的末尾,稱之爲旋轉數組,輸入一個遞增排序的數組的一個旋轉,輸出旋轉數組的最小元素。例如數組{3,4,5,1,2}是數組{1,2,3,4,5}的一個旋轉,該數組的最小值爲1;
1 #include<stdio.h>
2 int MinInOrder(int r[], int p1, int p2)
3 {
4 int result = r[p1];
5 for (int i = p1 + 1; i <= p2; i++)
6 {
7 if (r[i] < result)
8 result = r[i];
9 }
10 return result;
11 }
12 int Min(int r[], int length)
13 {
14 if (r == NULL || length <= 0)
15 return 0;
16 int p1 = 0;
17 int p2 = length - 1;
18 int mid = p1;
19 while (r[p1] >= r[p2])
20 {
21 if (p2 - p1 == 1)
22 {
23 mid = p2;
24 break;
25 }
26 mid = (p1 + p2) / 2;
27 if (r[p1] == r[p2] && r[mid] == r[p2])
28 return MinInOrder(r, p1, p2);
29 if (r[mid] >= r[p1])
30 p1 = mid;
31 else if (r[mid] <= r[p2])
32 p2 = mid;
33 }
34 return r[mid];
35 }
36
37 int main()
38 {
39 int a[8] = { 1, 1, 1, 0, 1 };
40 printf("%d\n", Min(a, 5));
41 return 0;
42 }
View Code
52.分割數字
給定一個整數n和一個整數m,將n按照位分割成多個數字,使得這多個數字的和最接近m,
例如n=654321,m=50,則最大值爲48(6+5+4+32+1)。
分析:
(1)對於一個Integer類型的數字n和m,首先有種特殊狀況; 即 n<m :直接返回n;
(2)將整數n按位存入一個整型數組中,所求的最大值的位數確定小於等於m的位數,
則以2爲大小做爲窗口在n所在的數組上進行滑動,每滑動一次,將窗口中的數字表示成十進制並和窗口爲的其餘數字進行相加,判斷是否大於設定的一個numMax,
而且這個數字小於m,則將這個數字賦給numMax。
(3)依次增長窗口的大小直到小於等於m的位數爲止。
java代碼:
1 package cvte;
2
3 import java.util.Scanner;
4
5 /*
6 * 題目:給定一個整數n和一個整數m,將n按照位分割成多個數字,使得這多個數字的和最接近m,
7 * 例如n=654321,m=50,則最大值爲48(6+5+4+32+1)
8 * */
9 public class Main {
10 // 求最大值
11 public static Integer plimit(Integer n, Integer m) {
12 if (n < m)
13 return n;
14 Integer add = 0; //把全部的位加起來的和
15 Integer maxNum = 0; //最終所求結果
16 Integer count = 0; //輔助計數器,計算每一個子數組中按位加起來的的和
17 Integer madd = 0; //輔助計數,把每一個子數組中的數字表示成十進制
18 Integer mc = 0; //輔助計數,把每一個子數組中的數字表示成十進和其餘位按位加起來的總和
19 int a = 0, b = 0; //標記子數組第一位和最後一位的指針
20 String nstr = n.toString(); //將n轉化成字符串
21 String mstr = m.toString(); //將m轉化字符串
22 int nlength = nstr.length(); // n的長度
23 int mlength = mstr.length(); // m的長度
24 int[] narr = new int[nlength]; // 新建一個數組用來保存num每一位的數字
25 for (int i = 0; i < nlength; i++) {
26 Character ch = nstr.charAt(i); // 遍歷nstr將每一位數字添加到narr
27 narr[i] = Integer.parseInt(ch.toString());
28 }
29 for (int i = 0; i < nlength; i++) {
30 add += narr[i];
31 }
32 if (add < m){
33 for (int i = 2; i <= mlength; i++) {
34 a = 0;
35 b = i - 1;
36 while (b < nlength) {
37 for (int j = a; j <=b; j++) {
38 //System.out.println("j="+j);
39 count += narr[j];
40 madd = madd + (int) (narr[j] * Math.pow(10, (b - j)));
41 a++;
42 }
43 mc = (add - count) + madd;
44 //System.out.println("mc="+mc);
45 if (mc > maxNum && mc < m) {
46 maxNum = mc;
47 }
48 b++;
49 a = b - i + 1;
50 madd=0;
51 count=0;
52 //System.out.println("a= b="+a+" "+b);
53 }
54
55 }
56 }
57 return maxNum;
58 }
59
60 public static void main(String[] args) {
61 Scanner in = new Scanner(System.in);
62 Integer n = in.nextInt();
63 Integer m = in.nextInt();
64 System.out.println(plimit(n, m));
65 }
66
67 }
68 /*
69 例一:
70 輸入:
71 50
72 輸出:
73 例二:
74 輸入:
75 661
76 輸出:
77 */
View Code
53.矩陣壓縮處理
1.特殊矩陣
(1)上三角形
上三角形的矩陣的有效元素只有n(n+1)/2,上三角形中元素A[i][j]在一維數組中存儲地址爲:
按行存儲:LOC(A[i][j])=LOC(A[1][1])+(i-1)(2n-i+2)/2+j-i;
(2)下三角形
上三角形的矩陣的有效元素只有n(n+1)/2,上三角形中元素A[i][j]在一維數組中存儲地址爲:
按行存儲:LOC(A[i][j])=LOC(A[1][1])+i(i-1)/2+j-1;
(3)三對角矩陣
按行存儲:LOC(A[i][j])=LOC(A[1][1])+2(i-1)+j-1;
54.斐波那契數列
(1).含義:斐波那契數列是根據兔子的繁殖獲得的一組數列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55,89, 144, 233....其特色是從第三項開始每一項都等於前兩項之和。
(2).解法
對於這個數列,第一種解法就是用公式 f(n) = f(n-1)+f(n-2) 遞歸調用,但這種方法有大量的計算是重複的,時間複雜度以n的指數增長,具體代碼以下:
1 long f1(int n)
2 {
3 if(n<=0)
4 return 0;
5 if (n ==1)
6 return 1;
7 return f1(n-1) + f1(n-2);
8 }
第二種解法也比較好理解,若是先求f(1),f(2),再根據f(1)和f(2)就出f(3),以此論推求出f(n),這種計算方法的時間複雜度是O(n)。這種方法是給數列前面加一個0,也就是說序列是從0開始,具體代碼以下:
1 long f1(int n)
2 {
3 long x = 0, y = 1;
4 for (int i = 1; i < n; i++)
5 {
6 y = x + y; //當前得值等於前兩項之和
7 x = y - x; //當前項的前一項等於當前項減去當前項的前一項的前一項
8 }
9 return y;
10 }
歡迎掃碼關注個人微信公衆號,或者微信公衆號直接搜索Java傳奇,不定時更新一些學習筆記!