1小时内必须解决的5个编程问题

题目的来源:

http://www.codeceo.com/article/5-problems-programmer-1-hour.html


5个问题

问题1

使用for循环、while循环和递归写出3个函数来计算给定数列的总和。

问题2

编写一个交错合并列表元素的函数。例如:给定的两个列表为[a,B,C]和[1,2,3],函数返回[a,1,B,2,C,3]。

问题3

编写一个计算前100位斐波那契数的函数。根据定义,斐波那契序列的前两位数字是0和1,随后的每个数字是前两个数字的和。例如,前10位斐波那契数为:0,1,1,2,3,5,8,13,21,34。

问题4

编写一个能将给定非负整数列表中的数字排列成最大数字的函数。例如,给定[50,2,1,9],最大数字为95021。

问题5

编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100。



第四题的第二种方法和第五题是借鉴的.



package SuanFa;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class FiveS {

	

	public static int One1(int[] a) {
		int sum = 0;
		for (int i = 0; i < a.length; i++)
			sum += a[i];
		return sum;
	}

	public static int One2(int[] a) {
		int sum = 0;
		int b = a.length;
		while (b > 0) {
			sum += a[b - 1];
			b--;
		}
		return sum;
	}

	public static int One3(int[] a, int n) {
		if (n == 0)
			return a[n];
		else {
			return a[n] + One3(a, n - 1);

		}
	}

	public static List Hebing(List a, List b) {
		List c = new ArrayList();

		for (int i = 0; i < (a.size() > b.size() ? a.size() : b.size()); i++) {
			if (a.size() > i)
				c.add(a.get(i));
			if (b.size() > i)
				c.add(b.get(i));
		}
		return c;
	}

	public static int FeiBo(int i) {
		if (i == 1)
			return 0;
		if (i == 2 || i == 3)
			return 1;
		else
			return FeiBo(i - 1) + FeiBo(i - 2);

	}

	public static String getMax2() {

		Integer[] VALUES = { 50, 2, 100, 99, 5, 7, 51, 50, 11 };
		// 多思考关联性
		// 比如:我的思考是比较哪个数该放到前面,就是它的最高位数字最大
		// 这个题的思路是思考的两个数放到一块,怎么放数字最大.这样所有的数字都两两比较一下,就可以排出序了
		Arrays.sort(VALUES, new Comparator<Object>() {
			public int compare(Object lhs, Object rhs) {
				String v1 = lhs.toString();
				String v2 = rhs.toString();
				return (v1 + v2).compareTo(v2 + v1) * -1;
				// 如果v1+v2>v2+v1则返回正数,否则返回负数
			}
		});

		String result = "";
		for (Integer integer : VALUES) {
			result += integer.toString();
		}

		return result;

	}

	public static int getMax(int[] a) {

		List list = new ArrayList();
		for (int i = 0; i < a.length; i++) {
			list.add(a[i]);
		}
		int size = list.size();

		int sum = 0;
		for (int i = 0; i < size; i++) {
			int maxnum = 0;
			int max = 0;
			int maxindex = 0;
			int time = 1;
			for (int j = 0; j < list.size(); j++) {
				int x = Integer.parseInt(list.get(j).toString());
				while (x >= 10) {
					time++;
					x /= 10;
				}

				// max = max > x ? max : x;
				if (max < x) {
					maxnum = Integer.parseInt(list.get(j).toString());
					max = x;
					maxindex = j;
				}

			}
			list.set(maxindex, 0);
			int n = 1;
			for (int i1 = 0; i1 < time; i1++)
				n = n * 10;
			sum = sum * n + maxnum;
		}

		return sum;
	}

	public static void result() {
		int i = 0, qian = 0, hou = 0;// 一个运算符连的2个数分别为qian hou
		int ysf = 0;// 运算符
		int qh = 0;// 当前是qian还是hou的标记 0为qian 1为hou
		int total = 0;// 算式结果
		int[] suan = new int[8];// 8个可能的运算符插入位,0表没有,1表加法,2表减法

		for (suan[0] = 0; suan[0] < 3; suan[0]++)
			// 1 2间的运算符
			for (suan[1] = 0; suan[1] < 3; suan[1]++)
				// 2 3间的运算符
				for (suan[2] = 0; suan[2] < 3; suan[2]++)
					// 3 4间的运算符
					for (suan[3] = 0; suan[3] < 3; suan[3]++)
						// 4 5间的运算符
						for (suan[4] = 0; suan[4] < 3; suan[4]++)
							// 5 6间的运算符
							for (suan[5] = 0; suan[5] < 3; suan[5]++)
								// 6 7间的运算符
								for (suan[6] = 0; suan[6] < 3; suan[6]++)
									// 7 8间的运算符
									for (suan[7] = 0; suan[7] < 3; suan[7]++)// 8
																				// 9间的运算符
									{
										// 重置
										qian = 1;// 第一个数
										ysf = 0;
										qh = 0;
										total = 0;
										// 开始运算
										for (i = 0; i < 8; i++) {
											// 无运算符
											if (suan[i] == 0) {
												if (qh == 0)
													qian = qian * 10 + (i + 2);
												else
													hou = hou * 10 + (i + 2);
											}
											// 遇到了新运算符
											else {
												// 完成前一运算符的计算,结果为qian,依然取hou
												if (qh == 1) {
													total = qian + ysf * hou;
													qian = total;
													hou = i + 2;
												}
												// 开始取hou数
												else {
													qh = 1;
													hou = i + 2;
												}
												// 更新运算符
												if (suan[i] == 1)
													ysf = 1;
												else
													ysf = -1;
											}
										}
										// 完成最后一个运算
										total = qian + ysf * hou;
										// 输出
										if (total == 100) {
											for (i = 0; i < 9; i++) {
												System.out.print(i + 1);
												if (i < 8 && suan[i] == 1)
													System.out.print("+");
												if (i < 8 && suan[i] == 2)
													System.out.print("-");
											}
											System.out.println("=" + total);
										}
									}

	}
	
	public static void main(String[] args) {
		// int[] a = new int[100];
		// for (int i = 0; i < 100; i++)
		// a[i] = 1;
		// System.out.println(One1(a));
		// System.out.println(One2(a));
		// System.out.println(One3(a, a.length - 1));

		// List list = new ArrayList();
		// List list2 = new ArrayList();
		// list.add("a");
		// list.add("b");
		// list.add("c");
		// list.add("a");
		// list.add("b");
		// list.add("c");
		// list.add("a");
		// list.add("b");
		// list.add("c");
		// list2.add("1");
		// list2.add("2");
		// list2.add("3");
		// list2.add("4");
		// list2.add("5");
		// List c = Hebing(list, list2);
		// System.out.println(c.toString());

		// System.out.println(FeiBo(100));

		// int[] ii = new int[] { 50, 2, 1, 9 };
		// System.out.println(getMax(ii));

		result();

	}
	
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值