趣味算法(一)
趣味算法(一)
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;
}
}