[編程題] 汽水瓶
有這樣一道智力題:“某商店規(guī)定:三個(gè)空汽水瓶可以換一瓶汽水。小張手上有十個(gè)空汽水瓶痹栖,她最多可以換多少瓶汽水喝曹货?”答案是5瓶,方法如下:先用9個(gè)空瓶子換3瓶汽水淳梦,喝掉3瓶滿的,喝完以后4個(gè)空瓶子昔字,用3個(gè)再換一瓶爆袍,喝掉這瓶滿的,這時(shí)候剩2個(gè)空瓶子作郭。然后你讓老板先借給你一瓶汽水陨囊,喝掉這瓶滿的,喝完以后用3個(gè)空瓶子換一瓶滿的還給老板夹攒。如果小張手上有n個(gè)空汽水瓶蜘醋,最多可以換多少瓶汽水喝?
輸入描述:
輸入文件最多包含10組測試數(shù)據(jù)咏尝,每個(gè)數(shù)據(jù)占一行压语,僅包含一個(gè)正整數(shù)n(1<=n<=100)啸罢,表示小張手上的空汽水瓶數(shù)。n=0表示輸入結(jié)束胎食,你的程序不應(yīng)當(dāng)處理這一行扰才。
輸出描述:
對于每組測試數(shù)據(jù),輸出一行厕怜,表示最多可以喝的汽水瓶數(shù)衩匣。如果一瓶也喝不到,輸出0粥航。
輸入例子:
3
10
81
0
輸出例子:
1
5
40
我的思路是一次性算出所有空瓶琅捏,然后加到一起,最后再統(tǒng)一除以3
注意每一次除以3后得到的數(shù)再次計(jì)算時(shí)應(yīng)該加上余數(shù)
import java.util.Scanner;
public class test1015 {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n;
while(sc.hasNext()){
n=sc.nextInt();
if(n==0)break;
int sum=n;
while(n/3!=0){
sum+=n/3;
int m=n%3;
n=n/3+m;
}
if(n==2)
sum++;
System.out.println(sum/3);
}
}
}
如果發(fā)現(xiàn)了這個(gè)問題本質(zhì)遞歸 就更方便
*遞歸問題3個(gè)瓶子換1瓶水+1個(gè)空瓶子躁锡,兩個(gè)瓶子換1瓶水+0個(gè)空瓶子午绳,1個(gè)瓶子換0瓶水置侍。
f(1) = 0
f(2) = 1
f(3) = 1
f(4) = f(2)+1 //4個(gè)瓶子映之,其中3個(gè)可以換1瓶水+1個(gè)空瓶,所以是f(2)+1
f(5) = f(3)+1 //3個(gè)瓶子換1瓶水+1個(gè)空瓶蜡坊,所以是f(3)+1
...
f(n) = f(n-2)+1 *
import java.util.Scanner;
public class Main {
public static int f(int n){
if(n==1)return 0;
if(n==2)return 1;
return f(n-2)+1;
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
if(n==0)break;
System.out.println(f(n));
}
}
}
[編程題] 明明的隨機(jī)數(shù)
明明想在學(xué)校中請一些同學(xué)一起做一項(xiàng)問卷調(diào)查杠输,為了實(shí)驗(yàn)的客觀性,他先用計(jì)算機(jī)生成了N個(gè)1到1000之間的隨機(jī)整數(shù)(N≤1000)秕衙,對于其中重復(fù)的數(shù)字蠢甲,只保留一個(gè),把其余相同的數(shù)去掉据忘,不同的數(shù)對應(yīng)著不同的學(xué)生的學(xué)號(hào)鹦牛。然后再把這些數(shù)從小到大排序,按照排好的順序去找同學(xué)做調(diào)查勇吊。請你協(xié)助明明完成“去重”與“排序”的工作曼追。
Input Param
n 輸入隨機(jī)數(shù)的個(gè)數(shù)
inputArray n個(gè)隨機(jī)整數(shù)組成的數(shù)組
Return Value
OutputArray 輸出處理后的隨機(jī)整數(shù)
注:測試用例保證輸入?yún)?shù)的正確性,答題者無需驗(yàn)證汉规。測試用例不止一組礼殊。
輸入描述:
輸入多行,先輸入隨機(jī)整數(shù)的個(gè)數(shù)针史,再輸入相應(yīng)個(gè)數(shù)的整數(shù)
輸出描述:
返回多行晶伦,處理后的結(jié)果
輸入例子:
11
10
20
40
32
67
40
20
89
300
400
15
輸出例子:
10
15
20
32
40
67
89
300
400
解析:利用TreeSet非常方便的解決該問題。(寫本題的時(shí)候沒注意到測試用例不止一個(gè)啄枕,結(jié)果一直不對婚陪,吐血了發(fā)現(xiàn)是這個(gè)原因。以后一定要認(rèn)真讀題频祝,不能被迷惑了)
Set的功能方法
Set 的用法:
存放的是對象的引用近忙,沒有重復(fù)對象
Set set=new HashSet();
String s1=new String("hello");
String s2=s1;
String s3=new String("world");
set.add(s1);
set.add(s2);
set.add(s3);
System.out.println(set.size());//打印集合中對象的數(shù)目 為 2竭业。
Set 的 add()方法是如何判斷對象是否已經(jīng)存放在集合中?
boolean isExists=false;
Iterator iterator=set.iterator();
while(it.hasNext()) {
String oldStr=it.next();
if(newStr.equals(oldStr)){
isExists=true;
}
}
Set具有與Collection完全一樣的接口及舍,因此沒有任何額外的功能未辆,不像前面有兩個(gè)不同的List。實(shí)際上Set就是Collection,只是行為不同锯玛。(這是繼承與多態(tài)思想的典型應(yīng)用:表現(xiàn)不同的行為咐柜。)Set不保存重復(fù)的元素。
Set : 存入Set的每個(gè)元素都必須是唯一的攘残,因?yàn)镾et不保存重復(fù)元素拙友。加入Set的元素必須定義equals()方法以確保對象的唯一性。Set與Collection有完全一樣的接口歼郭。Set接口不保證維護(hù)元素的次序遗契。
HashSet : 為快速查找設(shè)計(jì)的Set。存入HashSet的對象必須定義hashCode()病曾。
TreeSet : 保存次序的Set, 底層為樹結(jié)構(gòu)牍蜂。使用它可以從Set中提取有序的序列。
LinkedHashSet : 具有HashSet的查詢速度泰涂,且內(nèi)部使用鏈表維護(hù)元素的順序(插入的次序)鲫竞。于是在使用迭代器遍歷Set時(shí),結(jié)果會(huì)按元素插入的次序顯示逼蒙。
import java.util.Scanner;
import java.util.TreeSet;
public class Main
{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
TreeSet<Integer> set=new TreeSet<Integer>();
int n=sc.nextInt();
if(n>0){
for(int i=0;i<n;i++){
set.add(sc.nextInt());
}
}
for(Integer i:set){
System.out.println(i);
}
}
}
}
[編程題] 進(jìn)制轉(zhuǎn)換
寫出一個(gè)程序从绘,接受一個(gè)十六進(jìn)制的數(shù)值字符串,輸出該數(shù)值的十進(jìn)制字符串是牢。(多組同時(shí)輸入 )
輸入描述:
輸入一個(gè)十六進(jìn)制的數(shù)值字符串僵井。
輸出描述:
輸出該數(shù)值的十進(jìn)制字符串。
輸入例子:
0xA
輸出例子:
10
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String s=sc.nextLine();
int sum=0;
int j=0;
for(int i=s.length()-1;i>=2;i--){
int m=(int) Math.pow(16, j);
char c=s.charAt(i);
switch(c){
case 'A':
sum+=10*m;
break;
case 'B':
sum+=11*m;
break;
case 'C':
sum+=12*m;
break;
case 'D':
sum+=13*m;
break;
case 'E':
sum+=14*m;
break;
case 'F':
sum+=15*m;
break;
default:
String xxx=c+"";
sum+=Integer.parseInt(xxx)*m;
}
j++;
}
System.out.println(sum);
}
}
}
后來發(fā)現(xiàn)jdk自帶進(jìn)制轉(zhuǎn)換方法 - - 受教了 很方便
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()){
String str=sc.next().substring(2);
System.out.println(Integer.parseInt(str,16));
}
}
} v
1驳棱、十進(jìn)制轉(zhuǎn)化為N進(jìn)制
Integer.toBinaryString(int i)//返回的是i的二進(jìn)制表示批什,返回類型為String
Integer.toString(int i,int radix)//返回的是i的二進(jìn)制表示,返回類型為String蹈胡,但是負(fù)數(shù)不適用渊季。
Integer.toHexString(int i)//返回16進(jìn)制
Integer.toOctalString(int i)//返回8進(jìn)制
System.out.println(Integer.toBinaryString(5));//101
System.out.println(Integer.toBinaryString(-5));//-5的二進(jìn)制的補(bǔ)碼形式
System.out.println(Integer.toString(5,2)//101
System.out.println(Integer.toString(-5,2)//結(jié)果不對,負(fù)數(shù)不能用此函數(shù)
2罚渐、N進(jìn)制轉(zhuǎn)化為十進(jìn)制
Integer.parseInt(String s,int radix)//radix進(jìn)制的s却汉,轉(zhuǎn)化為十進(jìn)制,返回類型為int
Integer.valueOf(String s,int radix)//同上
看到了別人寫的方法 也比我的簡單 貼上來學(xué)習(xí)
1.通過stringbuffer構(gòu)造字符串 用reverse方法 使得計(jì)數(shù)可以從0開始
2.使用substring明顯更方面
3.大A的ascii碼65 小a97 '0'的為48 要記住 使用更快捷
//其實(shí)不記住也行 通過Integer.valueOf('A')輸出可以查看
吸取教訓(xùn) 希望下次代碼可以更簡潔荷并。合砂。
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()){
StringBuffer sb=new StringBuffer();
sb.append(sc.next());
String str=sb.reverse().substring(0,sb.length()-2);
char ch[]=str.toCharArray();
int sum=0;
for(int i=0;i<ch.length;i++){
if(ch[i]>='A'&&ch[i]<='F'){
sum+=(Integer.valueOf(ch[i])-55)*Math.pow(16,i);
}else {
sum+=(Integer.valueOf(ch[i])-48)*Math.pow(16,i);
}
}
System.out.println(sum);
}
}