一些小的算法,都是java版的,網絡上大量的題都是針對C++的,因此java的實現很少,但是都是考的基礎,
實現都是一樣,可以開闊一下思路,有益無敝。
/**
* 1 跳臺階問題
* 題目:一個臺階總共有n級,如果一次可以跳1級,也可以跳2級。
* 求總共有多少總跳法,並分析算法的時間複雜度。
* 是一個組合題, 完全正確很難,
* 總共有m臺階 n爲2個臺階
* O( ( m - n) * (2n - 1)) )
*/
public class JumpFootstep {
public static void main(String[] args) {
jumpStepWay(10);
}
private static void jumpStepWay(int n) {
int twoStep = 1;
while (2 * twoStep <= n) {
printLeftJoin(twoStep, n);
for (int i = 1; i <= twoStep; i++) {
int oneStep = n - 2 * twoStep;
List<Integer> ls = new ArrayList<Integer>();
for (int j = 1; j <= oneStep; j++) {
for (int k = 0; k < (twoStep - i); k++) {
ls.add(2);
}
for (int m = 0; m < j; m++) {
ls.add(1);
}
for (int m = 0; m < i; m++) {
ls.add(2);
}
for (int m = 0; m < oneStep - j; m++) {
ls.add(1);
}
print(ls);
ls.clear();
}
if (i != twoStep) {
for (int j = 1; j <= oneStep; j++) {
for (int m = 0; m < j; m++) {
ls.add(1);
}
for (int m = 0; m < i; m++) {
ls.add(2);
}
for (int m = 0; m < oneStep - j; m++) {
ls.add(1);
}
for (int k = 0; k < (twoStep - i); k++) {
ls.add(2);
}
print(ls);
ls.clear();
}
}
}
twoStep++;
}
}
private static void printLeftJoin(int twoStep, int n){
for (int i = 1; i <= twoStep; i++) {
System.out.print(2);
}
for (int i = 1; i <= n - 2 * twoStep; i++) {
System.out.print(1);
}
System.out.println();
}
private static void print(List<Integer> ls ){
for (int m = 0; m < ls.size(); m++) {
System.out.print(ls.get(m));
}
System.out.println();
}
}
跳臺階的答案中有重複的輸出,是一個待解決之問題!
/**
* 2 整數的二進制表示中1的個數
* 題目:輸入一個整數,求該整數的二進制表達中有多少個1。
* 例如輸入10,由於其二進制表示爲1010,有兩個1,因此輸出2。
*
* @author wangjichen
*
*/
public class BinaryOneCount {
public static void main(String[] args) {
long b = 1101;
long i = 1;
int count = 0;
int time = 0;
while (i > 0) {
long f = i & b;
f >>= time;
if (f == 1) {
count++;
}
i <<= 1;
time++;
}
System.out.println(count);
}
}
千萬不能把b的值向右移動,來和i=1相比較,會出現死循環,想一想爲什麼吧。。。
/**
* 3 在從1到n的正數中1出現的次數
* 題目:輸入一個整數n,求從1到n這n個整數的十進制表示中1出現的次數。
* 例如輸入12,從1到12這些整數中包含1 的數字有1,10,11和12,1一共出現了5次。 分析:這是一道廣爲流傳的google面試題。
*
* @author wangjichen
*
*/
public class DecimalOneCount {
public static void main(String[] args){
judge(111);
}
private static void judge(int n){
int result = 0;
for(int i = n; i >= 0; i --){
result += eachJudge(i);
}
System.out.println(result);
}
private static int eachJudge(int n){
int count = 0;
while(n > 0){
int f = n % 10;
if(f == 1){
count ++;
}
n /= 10;
}
return count;
}
}
第二道題的答案是,當b爲負數時,就是死循環了。
不知道考官是不是想考這個,不過大體思路大家都會,估計左右移動的方向就是招人的分界線了。
謹慎是金哪!