趣味算法(一)

趣味算法(一)

1. 求Missed Number,找丢失的那个数

有一些数组如 int[]{0,1,2}
这样的一个数组,这个数组的第一个必须从0开始,以次+1列出,该数组内最后一个数是这个数组的长度,因此:
int[]{1,2}, missed number为0
int[]{0,1,2}, missed number为3
int[]{0,2}, missed number为1

public class MissedNumber {
	public int findMissedOne(int[] numArray) {
		int sum = 0;
		int idx = -1;
		for (int i = 0; i < numArray.length; i++) {
			if (numArray[i] == 0) {
				idx = i;
			} else {
				sum += numArray[i];
			}
		}
		// the total sum of numbers between 1 and arr.length.
		int total = (numArray.length + 1) * numArray.length / 2;
		int missedNumber = total - sum;
		return missedNumber;
	}
}
public class TestMissedNumber {

	protected MissedNumber mNum = new MissedNumber();

	@Test
	public void testFindMissedOne() {
		int[] testArray = new int[] {0,2};
		int missedNumber = mNum.findMissedOne(testArray);
		System.out.println(missedNumber);
	}

}

万能公式:missed number = 数组内的数的总和减去((数组长度+1)*数组长度/2)

2. 我想买一个一块钱的冰棍,手里有1毛的若干,2毛的若干,5毛的若干,求我有多少种组合可以正好购买一根冰棍?

for (int i = 0; i < 10; i++) {
	for (int j = 0; j < 5; j++) {
		for (int x = 0; x < 2; x++) {
			int total = i * 1 + j * 2 + x * 5;
			if (total > 10)
				break;
			if (total == 10)
				System.out.println("cent 1 : " + i + ", cent 2 : " + j + ", cent 5 : " + x);
		}
	}
}

3. 输入一个正数n,输出所有和为n 连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3 个连续序列1-5、4-6 和7-8。注:n=3000000000。30亿!

long long sum=3000000000;
//正序 
for(long long n=2;sum/n>=n/2;n++){
	if(((n&1)==1 &&  sum %n ==0)||(sum%n*2==n)){
		cout << (sum/n-(n-1)/2) << "-" << (sum/n-(n-1)/2) + n -1  << endl;
	} 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值