1. 程式人生 > >JAVA實驗三:獲取位數、判斷迴文

JAVA實驗三:獲取位數、判斷迴文

題目


編寫一個Java應用程式。使用者從鍵盤輸入一個整數,程式將判斷這個數是幾位數並輸出其位數,並判斷這個數是否是迴文數(是,則輸出“是迴文數”,否則輸出“不是迴文數”)。迴文數是指將該數含有的數字逆序排列後得到的數和原數相同,例如12121、3223都是迴文數。要求:定義兩個方法,一個用於獲取一個整數的位數,一個用於返回一個整數是否為迴文數。

答案1(推薦)

import java.util.Scanner;

public class Main 
{
	static Scanner scan =new Scanner(System.in);
	static int input1=scan.nextInt();
	static String input=String.valueOf(input1);
	public int number()
	{
		return input.length();
	}
	public static String digits()
	{
		
		StringBuffer sb=new StringBuffer(input);
		sb.reverse();
		String s=sb.toString();
		System.out.println(s.length());
		return s;
	}
	public static void main(String[] args)
	{
		if(digits().equals(input)==true)
			System.out.println("是迴文數");
		else 
			System.out.println("不是迴文數");
	}
}

答案2(不推薦)

import java.util.Scanner;

public class Main 
{
	static Scanner scan=new Scanner(System.in);
	static int num=scan.nextInt();
	public static int Sum(int num)
	{
		int no=num;
		int sum=0;
		while(no!=0)
		{
			no/=10;
			sum+=1;
		}
		//System.out.println(sum);
		return sum;
	}
	public static boolean include()
	{
		int []a=new int[Sum(num)];
		int no=num;
		for(int i=0;i<Sum(num);i++)
		{
			a[i]=no%10;
			no/=10;
		}
		for(int i=0;i<Sum(num)/2;i++)
		{
			if(a[i]==a[Sum(num)-i-1])
				continue;
			else 
			{
				return false;
			}
		}
		return true;
	}
	public static void main(String[] args) 
	{
		if(include()==false)
		{
			System.out.println(Sum(num));
			System.out.println("不是迴文數");
		}
		else
		{
			System.out.println(Sum(num));
			System.out.println("是迴文數");
		}
	}
}

 


解析

看到這個題,會聯想到StringBuffer類中有一個倒置字串的函式:reverse(),值得注意的是,這個函式返回一個引用,也就是說,進行倒置之後原來的StringBuffer物件也就變了,所以一定要記得在寫的時候注意。

(一)StringBuffer講解

StringBuffer  https://blog.csdn.net/fighting123678/article/details/83443919

String           https://blog.csdn.net/fighting123678/article/details/83443685

1、StringBuffer類和String類的比較

(1)StringBuffer類和String類都是用來代表字串,但是StringBuffer與String內部實現方式不同。StringBuffer在進行字串處理時,不生成新的物件,對於StringBuffer物件的每次修改都會改變物件自身(這點是和String類最大的區別,String類所指物件的內容是不能修改的),在記憶體使用上要優於String類。所以在實際使用時,如果需要經常對一個字串進行修改,例如插入、刪除等操作的時候,使用StringBuffer要更加適合一些。

(2)StringBuffer是執行緒安全的,所以在多執行緒程式中也可以很方便的進行使用,但是程式的執行效率相對來說就要稍微慢一些。

(3)StringBuffer對toString方法進行了重寫,但是沒有對equals方法進行重寫,String類對toString和equals兩種方法都進行了重寫。

(4)StringBuffer和String屬於不同的型別,不能直接進行強制型別轉換。

(5)在StringBuffer類中存在很多和String類一樣的方法,這些方法在功能上和String類中的功能是完全一樣的。


2、StringBuffer物件的初始化

(1)初始化一個空StringBuffer物件

StringBuffer s = new StringBuffer();

(2)建立帶有內容的StringBuffer物件

StringBuffer s = new StringBuffer(“abc”);

這樣初始化出的StringBuffer物件的內容就是字串”abc”


3、StringBuffer物件和String物件之間的互轉

(1)正確方法

String轉StringBuffer

StringBuffer sb1 = new StringBuffer("123");

StringBuffer轉String

String s1 = sb1.toString(); 

兩者結合

String s = "abc";
StringBuffer sb1 = new StringBuffer("123");
StringBuffer sb2 = new StringBuffer(s);   //String轉換為StringBuffer
String s1 = sb1.toString();              //StringBuffer轉換為String

(2)錯誤方法(StringBuffer和String屬於不同的型別,不能直接進行強制型別轉換)

StringBuffer s = "abc";               //賦值型別不匹配
StringBuffer s = (StringBuffer)"abc";    //不存在繼承關係,無法進行強轉

4、StringBuffer常用方法

append方法

 public StringBuffer append(boolean b)

(1)作用是追加內容到當前StringBuffer物件的末尾,類似於字串的連線,呼叫該方法以後,StringBuffer物件的內容也發生改變

(2)例如:                 

StringBuffer sb = new StringBuffer(“abc”);
sb.append(true);

則物件sb的值將變成”abctrue”。


deleteCharAt方法

public StringBuffer deleteCharAt(int index)

(1)作用是刪除指定位置的字元,然後將剩餘的內容形成新的字串。

(2)例如:        

StringBuffer sb = new StringBuffer(“Test”);
sb. deleteCharAt(1);

該程式碼的作用刪除字串物件sb中索引值為1的字元,也就是刪除第二個字元,剩餘的內容組成一個新的字串,所以物件sb的值變為”Tst”。

(3)StringBuffer中還存在一個功能類似的delete方法

        

public StringBuffer delete(int start,int end)
  • 該方法的作用是刪除指定區間以內的所有字元,包含start,不包含end索引值的區間。
  • 例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb. delete (1,4);

該程式碼的作用是刪除索引值1(包括)到索引值4(不包括)之間的所有字元,剩餘的字元形成新的字串,則物件sb的值是”TString”。


insert方法

        

public StringBuffer insert(int offset, boolean b)

(1)作用是在StringBuffer物件中插入內容,然後形成新的字串。

(2)例如:                  

StringBuffer sb = new StringBuffer(“TestString”);
sb.insert(4,false);

該示例程式碼的作用是在物件sb的索引值4的位置插入false值,形成新的字串,則執行以後物件sb的值是”TestfalseString”。


reverse方法

        

public StringBuffer reverse()

(1)作用是將StringBuffer物件中的內容反轉,然後形成新的字串。

(2)例如:        

StringBuffer sb = new StringBuffer(“abc”);
sb.reverse();

經過反轉以後,物件sb中的內容將變為”cba”。


setCharAt方法   

public void setCharAt(int index, char ch)

(1)作用是修改物件中索引值為index位置的字元為新的字元ch。

(2)例如:                                    

StringBuffer sb = new StringBuffer(“abc”);
sb.setCharAt(1,’D’);

物件sb的值將變成”aDc”。


trimToSize方法

         

public void trimToSize()

(1)作用是將StringBuffer物件的中儲存空間縮小到和字串長度一樣的長度,減少空間的浪費。


(二)題目解析

(1)因為StringBuffer對toString方法進行了重寫,但是沒有對equals方法進行重寫,String類對toString和equals兩種方法都進行了重寫。所以說,先對StringBuffer型別轉換之後,再換成String型別的,進行比較是否相同

(2)字串的長度是用length(),而不是size()。