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

 

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


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){
		//方式一,利用StringBuffer
		StringBuffer 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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值