读书人

《字符反转猕猴摘桃》程序设计

发布时间: 2012-08-30 09:55:54 作者: rapoo

《字符反转,猴子摘桃》程序设计

?

在给应届生审题时,有如下两题,经常难倒各位同学,尤其是第一题,所以在下将个人的理解分享出来,希望大家顺利通过笔试。当然同学们得去理解代码,而不是死记。^.^


package com.jarjar.services;/** *  * @author Jiayb * */public class Test {public static void main(String[] args) {getPeach(10);System.out.println("递归方式:总数="+getPeachs(10));reverseString("abcdefgh");}/** * 题一: * 写一个函数reverseStrings(String  temp), * 实现逆转一个字符串的功能(比如输入字符串为:abcdef,则输出为:fedcba)。 */public static void reverseString(String str){//方式一,利用StringBufferStringBuffer sb = new StringBuffer(str);sb.reverse();System.out.println("StringBuffer方式: "+sb.toString());//方式二,数组String revStr = "";for (int i = str.length(); i >= 1; i--) {revStr = revStr+str.substring(i-1, i);}System.out.println(revStr);}/** * 题二: * 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾, * 又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。 * 以后每天早上都吃了前一天剩下的一半零一个。 * 到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少?  *//** * 根据天数计算第一天总共摘了多少桃子 * 递归 *  * @param numOfDays 总天数 * @return 第一天总共摘的桃子数 */public static int getPeachs(int days) {if (days < 1) {throw new RuntimeException("The days must more than zero!");}if (days == 1) {return 1;}return (getPeachs(days - 1) + 1) * 2;}/** * 根据天数计算第一天总共摘了多少桃子 *  * @param numOfDays *            总天数 * @return 第一天总共摘的桃子数 */public static void getPeach(int days) {// 方法一,逆向求值int peachs = 1; // 最后一天剩下的桃子for (int i = days - 1; i >= 1; i--) {// 从总天数的前一天开始,递加到第一天跳出循环/* * 下面程序的由来分析: 假如知道总数走正向的话,猴子吃掉的都是前一天剩下的一半桃子然后又多吃一个,即:明天的桃子数 = * (今天剩余数/2-1)个, 那么算法是--第一天吃掉(peachs/2-1)个,第二天是是(peachs/2-1)/2-1... * 现在我们知道最后一天剩下的个数,求总数,那么上面的公式反过来,即得到:前一天的桃子数 = (当天剩余数+1)*2 */peachs = 2 * (peachs + 1);}System.out.println("方式一:总桃子数量" + peachs + "个!");// 方法二,累加匹对int peachNum = 0; // 桃子个数int temp = 0; // 用来匹对的变量while (true) {peachNum++;temp = peachNum; // 将累加的桃子赋值给临时变量,进行运算// 累加到第十天for (int i = 1; i < days; i++) {temp = temp / 2 - 1;}if (temp == 1) { // 吃了十天后若按题意剩下一个即满足题意,跳出循环break;}}System.out.println("方式二:总桃子数量" + peachNum + "个!");}}

?

控制台输出:
方式一:总桃子数量1534个!
方式二:总桃子数量1534个!
递归方式:总数=1534
StringBuffer方式: hgfedcba
hgfedcba

?

读书人网 >编程

热点推荐