java經典程式設計題30道題,強烈推薦

qauchangqingwei發表於2018-08-28

1.程式設計實現:二分搜尋演算法

解答:

public class SearchTest {

/** 被搜尋資料的大小 */

private static final int size = 5000000;

public static void main(String[] args) {

long[] data = new long[size];

// 新增測試資料

for (int k = 0; k < data.length; k++) {

data[k] = k;

}

// 要查詢的資料

long target = 4970002;

binaryFindTest(data, target);

}

/**

* 二分搜尋演算法實現

*

* @param data

* 資料集合

* @param target

* 搜尋的資料

* @return 返回找到的資料的位置,返回-1表示沒有找到。

*/

public static int binaryFind(long[] data, long target) {

int start = 0;

int end = data.length – 1;

while (start <= end) {

int middleIndex = (start + end) / 2;

if (target == data[middleIndex]) {

return middleIndex;

}

if (target >= data[middleIndex]) {

start = middleIndex + 1;

} else {

end = middleIndex – 1;

}

}

return -1;

}

/**

* 二分搜尋測試

*

* @param data

* 資料集合

* @param target

* 搜尋的資料

*/

public static void binaryFindTest(long[] data, long target) {

long start = System.nanoTime();

int result = binaryFind(data, target);

long end = System.nanoTime();

System.out.println(“binary search position:” + result);

System.out.println(“binary search time:” + (end – start));

}

}

2.程式設計實現:執行緒A向佇列Q中不停寫入資料,執行緒B從佇列Q中不停讀取資料(只要Q中有資料)。

解答:

介面中有兩個一個是向佇列中寫push方法 一個是從佇列中讀。

public interface StackInterface

{

public void push(int n);

public int[] pop();

}

上邊介面的實現類。

public class SafeStack implements StackInterface {

private int top = 0;

private int[] values = new int[10];

private boolean dataAvailable = false;

public void push(int n) {

synchronized (this) {

while (dataAvailable) // 1

{

try {

wait();

} catch (InterruptedException e) {

// 忽略 //2

}

}

values[top] = n;

System.out.println(“壓入數字” + n + “步驟1完成”);

top++;

dataAvailable = true;

notifyAll();

System.out.println(“壓入數字完成”);

}

}

public int[] pop() {

synchronized (this) {

while (!dataAvailable) // 3

{

try {

wait();

} catch (InterruptedException e) {

// 忽略 //4

}

}

System.out.print(“彈出”);

top–;

int[] test = { values[top], top };

dataAvailable = false;

// 喚醒正在等待壓入資料的執行緒

notifyAll();

return test;

}

}

}

讀執行緒

public class PopThread implements Runnable

{

private StackInterface s;

public PopThread(StackInterface s)

{

this.s = s;

}

public void run()

{

while(true)

{

System.out.println(“->”+ s.pop()[0] + “<-”);

try {

Thread.sleep(100);

}

catch(InterruptedException e){}

}

}

}

寫執行緒

public class PushThread implements Runnable

{

private StackInterface s;

public PushThread(StackInterface s)

{

this.s = s;

}

public void run()

{

int i = 0;

while(true)

{

java.util.Random r = new java.util.Random();

i = r.nextInt(10);

s.push(i);

try {

Thread.sleep(100);

}

catch(InterruptedException e){}

}

}

}

3.程式設計實現:使用Socket經行網路通訊時,客戶端和伺服器端流程。

解答:

伺服器,使用ServerSocket監聽指定的埠,埠可以隨意指定(由於1024以下的埠通常屬於保留埠,在一些作業系統中不可以隨意使用,所以建議使用大於1024的埠),等待客戶連線請求,客戶連線後,會話產生;在完成會話後,關閉連線。

客戶端,使用Socket對網路上某一個伺服器的某一個埠發出連線請求,一旦連線成功,開啟會話;會話完成後,關閉Socket。客戶端不需要指定開啟的埠,通常臨時的、動態的分配一個1024以上的埠。

4.編寫程式碼實現同一平面內兩圓是否碰撞,其中:

第一個圓圓心座標為(x1,y1),半徑是r1,第二個圓圓心座標為(x2,y2),半徑是r2。

方法宣告如下:

boolean collisWith(int x1,int y1,int r1,int x2,int y2,int r2){}

解答:

boolean collisWith(int x1, int y1, int r1, int x2, int y2, int r2) {

boolean flag=false;

int num1=(x1-x2)*(x1-x2);

int num2=(y1-y2)*(y1-y2);

int num3=num1+num2;

double distance=Math.sqrt(num3);

if(distance<=(r1+r2)){

flag=true;

}

return flag;

}

5.判斷一個int陣列中的元素是否存在重複,方法宣告如下:

boolean isRepeat(int[] m){ }

解答:

public boolean isRepeat2(int[] m){ Set h =new HashSet(m.length); for (int i = 0; i < m.length; i++) { h.add(new Integer(m[i])); } if (h.size()==m.length ){ return false; }else { return true; } }

6.用遞迴方法實現正序顯示陣列元素。例如String[] s = {“a”,”b”,”c”,”d”};

方法宣告如下:

void print(String[] s,int i){ }

解答:引數 i 是指列印string陣列的起始位置,原理是正序列印s從第0個開始的所有字串,等價於先列印第0個,在列印s中從第一個開始的所有字串,如此遞迴

void print(String[] s, int i) {

if ((i >= 0) && (i < s.length)) {

System.out.print(s[i]);

i++;

print(s, i);

}

}

7.請寫出求n!的演算法。

解答:

public class Factorial {

public static void main(String[] args) {

long n = 6;

System.out.println(doFactorial(n));

}

public static long doFactorial(long n) {

if (n < 1) {

System.out.println(“ERROR”);

return 0;

} else if (n == 1 || n == 2) {

return n;

} else {

return n * doFactorial(n – 1);

}

}

}

8.在當前的JSP網頁裡,提交使用者名稱和密碼,提交給post . jsp, post . jsp列印出使用者名稱和密碼並返回給瀏覽器。請寫出post . jsp

解答:

假設頁面使用者名稱和密碼在login.jsp裡,login.jsp頁面程式碼如下:

<form action=”post.jsp” method=”post”>

<input type=”text” name=”userName”>

<input type=”password” name=”pwd”>

<input type=”submit”>

</form>

post.jsp頁面程式碼:

<%

String userName=request.getParameter(“userName”);

String pwd=request.getParameter(“pwd”);

out.println(“使用者名稱:”+userName+”,密碼:”+pwd);

%>

9.編寫一個字元介面的Java Application 程式,接受使用者輸入的10個整數,並輸出這10個整數的最大值和最小值。

解答:採用了冒泡進行排序

import java.util.Scanner;

import java.util.Scanner;

public class MaxAndMin {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

int[] arr = new int[10];

for (int i = 0; i < arr.length; i++) {

int next = scanner.nextInt();

arr[i] = next;

}

int[] after=Arrays.sort(arr);

System.out.println(“最小值:”+after[0]+”,最大值:”+after[arr.length-1]);

}

}

10.寫一個排序演算法 1-100隨機數字 進行排序 要求效率。

解答:

public class Sort {

// 選擇排序方法

public static void selectionSort(int[] number) {

for (int i = 0; i < number.length – 1; i++) {

int m = i;

for (int j = i + 1; j < number.length; j++) {

if (number[j] < number[m])

m = j;

}

if (i != m)

swap(number, i, m);

}

}

// 用於交換陣列中的索引為i、j的元素

private static void swap(int[] number, int i, int j) {

int t;

t = number[i];

number[i] = number[j];

number[j] = t;

}

public static void main(String[] args) {

// 定義一個陣列

int[] num = new int[100];

for(int i=0;i<num.length;i++){

num[i]=(int)(Math.random()*100)+1;

}

// 排序

selectionSort(num);

for (int i = 0; i < num.length; i++) {

System.out.println(num[i]);

}

}

}

11.氣泡排序:依次比較相鄰的兩個數,將大數放在前面,小數放在後面。第一趟結束,在最後的數必是所有數中的最小數。重複以上過程,直至最終完成排序。由於在排序過程中總是大數往前放,小數往後放,相當於氣泡往上升,所以稱作氣泡排序。請用JAVA語言編寫一個完成氣泡排序演算法的程式。

解答:

int[] bubbleSort(int before[]) {

int t;

for (int i = 0; i < before.length; i++) {

for (int j = 0; j < before.length – i – 1; j++) {

if (before[j] > before[j + 1]) {

t = before[j];

before[j] = before[j + 1];

before[j + 1] = t;

}

}

}

return before;

}

12.寫出一段socket通訊(客戶端)的程式碼,功能描述如下:

a)客戶端發起socket通訊,報文結構為報文號(3位)+使用者名稱(5位)+密碼(8位)+ 結束符(固定為END)。此處報文號為100

b)服務端收到後返回應答報文,報文結構為報文號(3位)+驗證結果(2位)+結束符(固定為END)。此處報文號為101

c)Socket伺服器ip為192.168.0.2,埠號為9999

解答:

客戶端程式碼:

Socket sk = new Socket(“192.168.0.2″,9999);

OutputStream os = sk.getOutputStream();

PrintWriter pw = new PrintWriter(os,true);

pw.write(“100stone888888END”);

pw.close();

sk.close();

伺服器端程式碼:

ServerSocket vk = new ServerSocket(9999);

Socket sk = vk.accept();

OutputStream os = sk.getOutputStream();

PrintWriter pw = new PrintWriter(os,true);

pw.write(“101oldEND”);

pw.close();

sk.close();

13.編寫函式insert(String str),將字串”a,123;b,456;c,789”置入HashMap中。

解答:

import java.util.HashMap;

public class HashMapDemo {

HashMap<String,String> map=new HashMap<String,String>();

public void insert(String str){

map.put(“a”, str);

}

public static void main(String[] args) {

HashMapDemo demo=new HashMapDemo();

demo.insert(“a,123;b,456;c,789″);

}

}

14.有一陣列 a[1000]存放了1000 個數,這 1000個數取自1-999, 且只有兩個相同的數,剩下的 998個數不同, 寫一個搜尋演算法找出相同的那個數的值(請用 C# or JAVA程式設計實現,注意空間效率和時間效率儘可能優化)。

解答:

import java.util.Arrays;

public class SearchDemo {

/** 被搜尋資料的大小 */

private static final int size = 1000;

public static void main(String[] args) {

int[] data = new int[size];

// 新增測試資料

for (int k = 0; k < data.length; k++) {

data[k] = k + 1;

}

data[999] = 567;

result(data);

}

/**

* 呼叫分搜尋演算法的方法實現查詢相同元素

* @param data

*/

public static void result(int data[]){

Arrays.sort(data);

for (int i = 0; i < data.length; i++) {

int target = data[i];

data[i] = 0;

int result = binaryFind(data, target);

if (result != -1) {

System.out.println(“相同元素為:”+data[result]);

break;

}

}

}

/**

* 二分搜尋演算法實現

*

* @param data

* 資料集合

* @param target

* 搜尋的資料

* @return 返回找到的資料的位置,返回-1表示沒有找到。

*/

public static int binaryFind(int[] data, int target) {

int start = 0;

int end = data.length – 1;

while (start <= end) {

int middleIndex = (start + end) / 2;

if (target == data[middleIndex]) {

return middleIndex;

}

if (target >= data[middleIndex]) {

start = middleIndex + 1;

} else {

end = middleIndex – 1;

}

}

return -1;

}

}

15.下面是一個由*號組成的4行倒三角形圖案。要求:1、輸入倒三角形的行數,行數的取值3-21之間,對於非法的行數,要求丟擲提示“非法行數!”;2、在螢幕上列印這個指定了行數的倒三角形。

*******

*****

***

*

解答:

import java.util.Scanner;

public class Lines {

public static void main(String args[]) {

Scanner scanner = new Scanner(System.in);

int lines = scanner.nextInt();

if (lines > 3 && lines < 21) {

for (int i = lines-1; i >= 0; i–) {

for (int z = 0; z <= i * 2; z++) {

System.out.print(“*”);

}

System.out.print(“\n”);

}

}else{

System.out.println(“非法行數!”);

}

}

}

16.現有一個32位的整型變數 value和一個有32個元素的陣列a[32],要求:1、對value隨機賦值;2、讓陣列a[n]的值等於value“位n”的值,0<=n<=31。舉例:如果value的“位0”(Bit0)=0,那麼a[0]=0;如果value的“位10”(Bit10)=1,那麼a[10]=1。

解答:

public class Foo {

public static void main(String[] args) {

//產生隨機數

int random = (int) (Math.random() * Integer.MAX_VALUE + 1);

//轉成二進位制字串

String str=Integer.toBinaryString(random);

//轉成二進位制時最前面的零被省略,補上省略的0

if(str.length()<32){

for(int j=0;j<=32-str.length();j++){

str=”0″+str;

}

}

//給陣列賦值

int[] a=new int[32];

for(int i=0;i<str.length();i++){

a[i]=Integer.parseInt(String.valueOf(str.charAt(i)));

System.out.println(“a[“+i+”]=”+a[i]);

}

}

}

17.現有1~100共一百個自然數,已隨機放入一個有98個元素的陣列a[98]。要求寫出一個儘量簡單的方案,找出沒有被放入陣列的那2個數,並在螢幕上列印這2個數。注意:程式不用實現自然數隨機放入陣列的過程。

答:

int[] b = new int[]{….存入98個隨機的1~100的整數}; int[] a = new int[100]; for(int t : b) a[t-1]=t; for(int t=0; t < a.length; t++) if(a[t]==0) System.out.println(t+1);

18. 實現函式public String[ ] array(List list),其中引數list中元素型別為字串

解答:

public String[] array(List list) {

String[] elementData = new String[list.size()];

for(int i=0;i<list.size();i++){

elementData[i]=(String)list.get(i);

}

return elementData ;

}

19.建立類Person,其中儲存的成員資料為:age(int),sex(boolean),weight(int),至少有一個建構函式可以初始化這三個屬性值,同時提供獲取這三個屬性值的public方法

解答:

public class Person {

private int age;

private boolean sex;

private int weight;

public Person() {

}

public Person(int age, boolean sex, int weight) {

this.age = age;

this.sex = sex;

this.weight = weight;

}

public int getAge() {

return age;

}

public boolean isSex() {

return sex;

}

public int getWeight() {

return weight;

}

}

20.設計執行緒類WorkerThread,其建構函式接受一個message字串作為引數,把該字串列印到console上,同時,在WorkThread的main函式中啟動該執行緒。

解答:

public class WorkerThread extends Thread {

public WorkerThread(String message) {

System.out.println(message);

}

public static void main(String[] args) {

new WorkerThread(“hello world!”).start();

}

}

21.寫一個函式去掉一個字串中單詞間多餘的空格,使得相鄰兩個單詞間有且只有一個空格。例如當輸入字串是“Hello!_ _Game_programming_ _world!”時,呼叫該函式後字串變為“Hello!_Game_programming_world!”。

解答:

/**

* 去除字串中多餘的空格

*

* @param s

* 需要處理的字串

* @return 處理後的字串

*/

public String trimSpace(String before) {

String temp= “” + before.charAt(0);

for (int i = 1; i < before.length(); i++) {

char c = before.charAt(i);

// 如果當前字元是空格

if (c == ‘ ‘) {

// 判斷前一個不是是空格則新增,否則不新增

if (before.charAt(i – 1) != ‘ ‘) {

temp += c;

}

} else {

temp += c;

}

}

return temp;

}

22. 編寫一個程式,用來計算1到100間所有整數的和是多少?

解答:

public static void GetSum()

{

int sum = 0;

for(int i=1;i<=100;i++)

{

sum+=i;

}

System.out.println(“和為:”+sum);

}

23.請簡單寫出用JAVA連線Oracle資料庫,並執行一條/SQL語句。(只需要寫關鍵幾條語句即可,/SQL語句:SELECT*FROM t_users WHERE users_id=‘1111’)

解答:

Class.forName(“oracle.jdbc.OracleDriver”);

String url = “jdbc:oracle:thin:@127.0.0.1:1521:orcl”;

String user = “scott”;

String password = “tiger”;

Connection con = DriverManager.getConnection(url, user, password);

Statement stm = con.createStatement();

ResultSet rs = stm

.executeQuery(“SELECT*FROM t_users WHERE users_id=’1111′”);

while (rs.next()) {

// 取值

}

rs.close();

stm.close();

con.close();

24.在web應用開發過程中經常遇到輸出某種編碼的字元,如從GBK到iso8859-1等,如何輸出一個某種編碼的字串?

public static String translate(String str) {

String tempStr = “”;

try {

tempStr = new String(str.getBytes(“ISO-8859-1″), “GBK”);

tempStr = tempStr.trim();

} catch (Exception e) {

System.err.println(e.getMessage());

}

return tempStr;

}

25. 請寫出一個公用方法,輸入String返回該串是否含有非空字元,並寫出junit的測試用例

答:

public class TestString {

public static boolean hasBlank(String str) {

if (str.endsWith(“”) || str.startsWith(“”)) {

return false;

} else {

String[] strs = str.split(“”);

if (strs.length == 1) {

return false;

}

}

return true;

}

@Test

public void testFun() {

System.out.println(TestString.hasBlank(“test”));

}

}

26. JAVA實現一種排序

答:用插入法進行排序程式碼如下

package com.tarena;

import java.util.*;

class InsertSort

{

ArrayList list;

public InsertSort(int num,int mod)

{

list = new ArrayList(num);

Random rand = new Random();

System.out.println(“The ArrayList Sort Before:”);

for (int i=0;i<num ;i++ )

{

list.add(new Integer(Math.abs(rand.nextInt()) % mod + 1));

System.out.println(“list[“+i+”]=”+list.get(i));

}

}

public void SortIt()

{

Integer tempInt;

int MaxSize=1;

for(int i=1;i<list.size();i++)

{

tempInt = (Integer)list.remove(i);

if(tempInt.intValue()>=((Integer)list.get(MaxSize-1)).intValue())

{

list.add(MaxSize,tempInt);

MaxSize++;

System.out.println(list.toString());

}

else

{

for (int j=0;j<MaxSize ;j++ )

{

if (((Integer)list.get(j)).intValue()>=tempInt.intValue())

{

list.add(j,tempInt);

MaxSize++;

System.out.println(list.toString());

break;

}

}

}

}

System.out.println(“The ArrayList Sort After:”);

for(int i=0;i<list.size();i++)

{

System.out.println(“list[“+i+”]=”+list.get(i));

}

}

public static void main(String[] args)

{

InsertSort sort = new InsertSort(10,100);

sort.SortIt();

}

}

27. 編寫一個擷取字串的函式,輸入為一個字串和位元組數,輸出為按位元組擷取的字串。 但是要保證漢字不被截半個,如”我ABC”4,應該截為”我AB”,輸入”我ABC漢DEF”,6,應該輸出為”我ABC”而不是”我ABC+漢的半個”。

答:

package com.tarena;

public class SplitString {

String SplitStr;

int SplitByte;

public SplitString(String str, int bytes) {

SplitStr = str;

SplitByte = bytes;

System.out.println(“The String is:” + SplitStr + “;SplitBytes=”

+ SplitByte);

}

public void SplitIt()

{

int loopCount;

loopCount=(SplitStr.length()%SplitByte==0)?(SplitStr.length()/SplitByte):(SplitStr.length()/SplitByte+1);

System.out.println(“Will Split into “+loopCount);

for (int i=1;i<=loopCount ;i++ )

{

if (i==loopCount){

System.out.println(SplitStr.substring((i-1)*SplitByte,SplitStr.length()));

} else {

System.out.println(SplitStr.substring((i-1)*SplitByte,(i*SplitByte)));

}

}

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

SplitString ss = new SplitString(

“test中dd文dsaf中男大3443n中國43中國人0ewldfls=103″, 4);

ss.SplitIt();

}

}

28. 編寫程式將由數字及字元組成的字串中的數字擷取出來並按順序輸出,例如:“ABC137GMNQQ2049PN5FFF”輸出結果應該為01234579

答:

package com.tarena;

import java.util.Arrays;

public class NumberSplitChar {

public static void main(String[] args) {

String str=”ABC137GMNQQ2049PN5FFF”;

char[] beforechars=str.toCharArray();

char[] afterchars=new char[beforechars.length];

int j=0;

for(int i=0;i<beforechars.length;i++){

if(beforechars[i]>=’0′ && beforechars[i]<=’9′){

afterchars[j++]=beforechars[i];

}

}

Arrays.sort(afterchars);

for(int i=(afterchars.length-j);i<afterchars.length;i++){

System.out.print(afterchars[i]);

}

}

}

29. 請用JAVA實現兩個類,分別實現堆疊(Stack)和佇列(Queue)操作。

答:public class MyStack {

private List list;

public MyStack(){

list = new ArrayList();

}

public boolean isEmpty(){

return list.size() == 0;

}

public void push(Object obj){

list.add(obj);

}

public Object pop(){

if(list.size()>0){

Object obj = list.get(list.size()-1);

list.remove(list.size()-1);

return obj;

}else{

return null;

}

}

public int getNumber(){

return list.size();

}

}

class IntegerQueue {

public int[] integerQueue;// 用來當佇列

public int tail;// 隊尾

public int size;// 隊的長度,也可以設定一個預設值,溢位時從新申請

public IntegerQueue(int size) {

integerQueue = new int[size];

this.size = size;

tail = 0;

}

public void inQueue(int i) {

if (tail < size) {

this.integerQueue[tail] = i;

tail++;

} else {

System.err.println(“溢位啦!”);

}

}

public int outQueue() {

if (tail >= 0) {

int tmp = this.integerQueue[tail];

tail–;

return tmp;

} else {

System.err.println(“佇列為空!”);

throw new RuntimeException();

}

}

}

30. 假定螢幕的畫素寬度為screenWidth,寫一個函式計算一個字串需要分成幾行顯示。

要求:

1)、每行應儘可能多地顯示字元,但不能有字元部分或完全顯示在螢幕外。超過部分的字元換下一行顯示。

2)、每個字元的畫素寬度不一樣,每個字元的畫素寬度不一樣。用int GetCharWidth(char c)獲得每個字元的畫素寬度。

/**

* 計算一個字串可以分多少行進行顯示

*

* @param s

* 原始字串

* @param screenWidth

* 螢幕寬度

* @return 行數

*/

int calcLineNum(String s, int screenWidth) {

int length = 0;

// 行數

int n = 0;

// 統計長度

for (int i = 0; i < s.length(); i++) {

// 當前字元的寬度

int charLen = GetCharWidth(s.charAt(i));

// 總長度增加

length += charLen;

// 如果達到螢幕寬度

if (length > screenWidth) {

n++; // 行數+1

length = charLen; // 重新計算長度

}

}

// 最後一行處理

if (length > 0) {

n++;

}

return n;

}


      轉載來源於 https://blog.csdn.net/wickedvalley/article/details/51589792
      想要轉載請註明轉載來源 

相關文章