java經典演算法和例題
1.找出陣列中只出現一次的數,其他元素出現兩次。
方法一
package example;
/**@author 王志華
*@E-mail: [email protected]
*@date 建立時間:2018年1月26日 下午2:42:37
**/
public class FindOne {
public static void main(String[] args) {
int[] a={2,2,4,5,9,9,4};
int t=0;
for (int i = 0; i < a.length; i++) {
t^=a[i];//利用異或(^)預算的巧用:得出一個數和0異或還是自己
//一個數和自己異或是0的原理,且異或運算可交換 ,故最終的結果就是出現一次的那個數
}
System.out.println(t);
}
}
方法二
利用ASCII碼建立一個下標到256的陣列,初始值都賦值為0,然後遍歷陣列 出現的字元每次陣列值加1遍歷結束後 陣列織為n的就出現n次,這種方法可以計算字元出現的個數
或者如下
每個字元反正對應一個ASCII碼,計每個字元出現的下標即可。
需要2個特別的常量來表示2中情況: 1、這個字元沒出現過(標程裡為0) 2、這個字元多次出現(標程裡為-1) private static char firstAppearsOnlyonce(String str) {
int[] hash = new int[256]; //記錄每個字元對應的個數,共有256個ASCII碼
for(int i=0; i<256; i++){
hash[i] = 0;
}
for(int i=0; i<str.length(); i++){
hash[str.charAt(i)] ++; //建立一個字元與個數反對映關係!
}
for(int i=0; i<str.length(); i++){ //再遍歷一遍字串,找第一個出現一次字元
if(hash[str.charAt(i)] == 1){
return str.charAt(i);
}
}
2 給定一個英文字串,請寫一段程式碼找出這個字串中首先出現三次的那個英文字元。
輸入描述:
輸入資料一個字串,包括字母,數字等。
package example;
/*
*@author 王志華
*@E-mail: [email protected]
*@date 建立時間:2018年1月26日 下午2:42:37
**/
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/*
* 給定一個英文字串,請寫一段程式碼找出這個字串中首先出現三次的那個英文字元。
輸入描述:
輸入資料一個字串,包括字母,數字等。
*
*/
public class FindChar {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
Map<Character,Integer> map = new HashMap<Character,Integer>();
System.out.println("請輸入你要測試的字串");
String s=in.next();
char[] c=s.toCharArray();
for (int i = 0; i < c.length; i++) {
if(!(c[i]>='a'&&c[i]<='z') && !(c[i]>='A'&&c[i]<='z'))
continue;
if(!map.containsKey(c[i])){
map.put(c[i], 1);//如果,map不包含此元素,將每個元素的value設為1
}
else{
int val = map.get(c[i])+1;//如果已經包含子元素 則此元素的valve+1
if(val == 3){
System.out.println(c[i]);
break;
}
map.put(c[i],val);
}
}
}
}
3,列印楊輝三角
package yanghui;
/*
*@author 王志華
*@E-mail: [email protected]
*@date 建立時間:2018年1月26日 下午2:42:37
**/
import java.util.Scanner;
public class PrintYanghui {
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
System.out.println("請輸入你要列印楊輝三角的行數");
int num=in.nextInt();
int[][] a=new int[num][num];
for (int i = 0; i <a.length; i++) {
for (int j = 0; j <=i; j++) {
if(j==0||j==i){//找到規律賦值,切記不能用行數i=0;因為i=0只有次,j=0可以通過內迴圈獲得多次
a[i][j]=1;
}else{
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
}
}
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < 8-i; j++) {
System.out.print(" ");
}
for (int j = 0; j <=i; j++) {
System.out.print(a[i][j]+" ");
}
System.out.println("\n");
}
}
}
4.產生N個隨機數,並且計算個位數分別為1,2,3,4,5,6,7,8,9的數個數
方法一:用九個變數記錄不同個位數數的個數
package example1;
/*
*@author 王志華
*@E-mail: [email protected]
*@date 建立時間:2018年1月26日 下午2:42:37
**/
import java.util.Random;
import java.util.Scanner;
public class random {
public static void main(String[] args) {
Random r=new Random();
Scanner in=new Scanner(System.in);
System.out.println("請輸入隨機數的個數N");
int N=in.nextInt();
int[] a=new int[N];
int sum=0;
int sum1=0;
int sum2=0;
int sum3=0;
int sum4=0;
int sum5=0;
int sum6=0;
int sum7=0;
int sum8=0;
int sum9=0;
int m=0;
for (int i = 0; i < a.length; i++) {
a[i]=r.nextInt(100);
}
System.out.println("產生的隨機數為:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
for (int i = 0; i < a.length; i++) {
m=a[i]-((a[i]/10)*10);
if (m==0) {
sum++;
}else if (m==1){
sum1++;
}
else if (m==2){
sum2++;
}
else if (m==3){
sum3++;
}
else if (m==4){
sum4++;
}else if (m==5){
sum5++;
}else if (m==6){
sum6++;
}else if (m==7){
sum7++;
}else if (m==8){
sum8++;
}
else if (m==9){
sum9++;
}
}
System.out.println("個位數為0的數的總數為:"+sum);
System.out.println("個位數為1的數的總數為:"+sum1);
System.out.println("個位數為2的數的總數為:"+sum2);
System.out.println("個位數為3的數的總數為:"+sum3);
System.out.println("個位數為4的數的總數為:"+sum4);
System.out.println("個位數為5的數的總數為:"+sum5);
System.out.println("個位數為6的數的總數為:"+sum6);
System.out.println("個位數為7的數的總數為:"+sum7);
System.out.println("個位數為8的數的總數為:"+sum8);
System.out.println("個位數為9的數的總數為:"+sum9);
}
}
方法二:用陣列x[]記錄不同個位數的數的個數,顯然程式碼量要小的多,故陣列還以當變數一樣的記錄或標記;
/*
*@author 王志華
*@E-mail: [email protected]
*@date 建立時間:2018年1月26日 下午2:42:37
**/
public class random {
public static void main(String[] args) {
Random r=new Random();
Scanner in=new Scanner(System.in);
System.out.println("請輸入隨機數的個數N");
int N=in.nextInt();
int[] a=new int[N];
int[] x=new int[9];
int m=0;
for (int i = 0; i < x.length; i++) {
x[i]=0;//初始化陣列為0
}
for (int i = 0; i < a.length; i++) {
a[i]=r.nextInt(100);
}
System.out.println("產生的隨機數為:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
for (int i = 0; i < a.length; i++) {
m=a[i]-((a[i]/10)*10);
if (m==0) {
x[0]++;
}else if (m==1){
x[1]++;
}
else if (m==2){
x[2]++;
}
else if (m==3){
x[3]++;
}
else if (m==4){
x[4]++;
}else if (m==5){
x[5]++;
}else if (m==6){
x[6]++;
}else if (m==7){
x[7]++;
}else if (m==8){
x[8]++;
}
else if (m==9){
x[9]++;
}
}
for (int i = 0; i < x.length; i++) {
System.out.println("個位數為0的數的總數為:"+x[i]);
}}
}
}
5.實現微信發紅包功能,輸入金額m,和紅包個數n,產生n個隨機數,切n個紅包的金額和為m
package example3;
import java.math.BigDecimal;
import java.util.Random;
import java.util.Scanner;
public class RedPacket {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String choice;
do{
System.out.println("請輸入你要發紅包的個數");
int n=in.nextInt();
System.out.println("請輸入你要發紅包的總額");
double sum=in.nextDouble();
double [] money=new double[n];
for (int i = 0; i < money.length-1; i++) {
money[i]=random(sum);
sum-=money[i];
}
money[money.length-1]=sum;
for (int i = 0; i < money.length; i++) {
double d=money[i];
BigDecimal mData = new BigDecimal(d).setScale(2, BigDecimal.ROUND_HALF_UP);
//精確到 小數點後兩位
System.out.println(mData);
}
System.out.println("是否要繼續執行程式:Y:繼續 N結束");
choice=in.next();
}while(choice.equals("Y"));
}
public static double random(double money){
double m;
Random r=new Random();
m= r.nextDouble();
if (m<=0) {
m= r.nextDouble();
}
return m*money;
}
}
6.實現vip登入功能 每天只有3次輸入錯誤機會
package example2;
/*
*@author 王志華
*@E-mail: [email protected]
*@date 建立時間:2018年1月26日 下午2:42:37
**/
import java.util.Scanner;
public class isVip {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
System.out.println("請輸入您的賬號");
String s = in.next();
int a = 60;
int m = 3;
int x = 0;
do {
if (!s.equals("888888")) {
--m;
if(m>0){
System.out.println("你今天還有" + m + "次機會");
System.out.println("請重新輸入您的賬號");
s = in.next();}
if (m == 1) {
x = 1;
}
} else {
break;
}
} while (m > 0);
if (x == 1) {
System.out.println("再見");
} else {
System.out.print("歡迎你vip");
}
}
}
7.求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字。例如輸入2輸出2+22+222+2222+22222+222222=246912
package example2;
/*
*@author 王志華
*@E-mail: [email protected]
*@date 建立時間:2018年1月26日 下午2:42:37
**/import java.util.Scanner
public class deno {
public static void main(String[] args) {
int sum=0;
Integer m=0;
String str1="";
Scanner in=new Scanner(System.in);
System.out.println("請輸入一個整數");
int a=in.nextInt();
for (int i = 1; i <=a; i++) {
m+=Integer.valueOf(solution(i,a));
sum+=m;
}
for (int i = 1; i <=8; i++) {
str1+=solution(i,a)+"+";
}
System.out.println(str1+"="+m);
}
public static String solution(int a,int b){
String str="";
for (int i = 0; i < a; i++) {
str+=b;//利用字串和任何型別計算還是字串
}
return str;
}
}
8.給定一個數組,找出相同元素總數大於陣列大小一半的元素,並輸出
package example4;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
package example4;
/*
*@author 王志華
*@E-mail: [email protected]
*@date 建立時間:2018年1月26日 下午7:25:26
* /
public class FindMax {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
Map<Integer,Integer> map=new HashMap();
System.out.println("請輸入你要測試的陣列的大小");
int n=in.nextInt();
int[] a=new int[n];
int i;
System.out.println("請輸入你要測試的陣列的元素");
for ( i = 0; i < a.length; i++) {
int m=in.nextInt();
a[i]=m;
map.put(a[i], 1);
boolean b=map.containsKey(a[i]);
if (b) {
int p=map.get(a[i])+1;//如果出現相同的元素,key對應的valve加一
map.put(a[i], p);
}
}
for (int j = 0; j < map.size(); j++) {
if (map.get(a[j])>=a.length/2) {
System.out.println(a[j]);
}else {
System.out.println("不存在");
}
}
}
}
9.寫出雙色球開獎系統(標記陣列的經典運用)
/*
*@author 王志華
*@E-mail: [email protected]
*@date 建立時間:2018年1月27日 下午7:00:43
* 雙色球
雙色球需求:紅球選六個,籃球選一個
紅球6個:1--33
藍色球1個:1--16
1.構建一個紅球的陣列33個元素,每個元素是1.2.3.4.5.....33
2.隨機抽取6個球存到一個數組中
3.藍色球 1個
**/
package array.douublecolorball;
import java.util.Random;
public class DouubleColorBall {
public static void main(String[] args) {
int[] reaball=new int[33];
String result="";
int[] luckRadball=new int[6];
int luckBlueBall=0;
boolean[] b=new boolean[33];
Random r=new Random();
luckBlueBall=r.nextInt(16)+1;
for (int i = 0; i < reaball.length; i++) {
reaball[i]=i+1;
}
for (int j = 0; j < luckRadball.length; j++) {
if (!b[j]) {//如果隨機數還沒有出現在在數組裡面,此時b[i]為預設值false
luckRadball[j]=r.nextInt(33)+1;
b[j]=true;//此時隨機數出現在在數組裡面,把b[i]標記為true
}else {//其他情況一致產生隨機數知道不重複
do {
luckRadball[j]=r.nextInt(33)+1;
} while (b[j]=true);
}
}
for (int i = 0; i < luckRadball.length; i++) {
result+=luckRadball[i]+" ";
}
System.out.println("本次雙色球開獎結果為:"+"紅色球: "+result+"藍色球: "+luckBlueBall)
}
}
9求100到1000以內的水仙花數
/*
*@author 王志華
*@E-mail: [email protected]
*@date 建立時間:2018年1月27日 下午7:50:27
**/
package array.flowerNumber;
public class FlowerNumber {
public static void main(String[] args) {
System.out.println("100-1000中的水仙花數有:");
for(int i=100;i<1000;i++){
int ge = i%10;
int shi = i/10%10;
int bai = i/10/10%10;
//水仙花數判斷要求
if(i == (ge*ge*ge+shi*shi*shi+bai*bai*bai)){
System.out.println(i);
}
}
}
}
10.給定一個整數,求它的二進位制數,並輸入。
/*
*@author 王志華
*@E-mail: [email protected]
*@date 建立時間:2018年1月28日 下午3:30:47
**/
package tentotwo;
import java.util.Scanner;
public class TenToTwo {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
System.out.println("請輸入一個整數");
int num=in.nextInt();
int num1=Math.abs(num);//無論正負都先用它的絕對值
StringBuffer str1=new StringBuffer();
while(num1/2!=0||num1%2!=0){
str1.append(num1%2+"");
num1=num1/2;
}
if (num<0) {
str1.append(1+"");//如果是負數,在前面加一個符號位1,正數不加
}
StringBuffer str=str1.reverse();//因為是從後往前加的,故要把字串倒置過來
System.out.println(str);
}
}
11.輸入一段字串,找出字串裡面連續數字最長的數字串,如 輸入as1254dad14 輸出1254
/*演算法思想:用max表示經過的數字長度最大值,count表示數字計數器,當為字母時重置為0
*end表示數字尾部,每次滿足數字時,對max進行判斷,當max小於於count時,更新max和end
*/
/*
*@author 王志華
*@E-mail: [email protected]
*@date 建立時間:2018年1月28日 下午12:57:17
**/
package maxstring;
import java.util.Scanner;
public class MaxStr {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
String str = scanner.nextLine();
int max = 0;
int count=0,end=0;
for(int i=0;i<str.length();i++){
if(str.charAt(i)>='0' && str.charAt(i)<='9'){
count++;
if(max<count){
max= count;
end = i;
}
}else{
count = 0;
}
}
System.out.println(str.substring(end-max+1,end+1));
}
}