[关闭]
@yudesong 2017-06-24T14:17:55.000000Z 字数 3247 阅读 551

算法基础

算法基础


算法基础部分

算法是对特定问题求解步骤的一种描述,算法是指令的有限序列,其中每一条指令表示一个或多个操作。 算法具有以下5个属性:

所以对应的算法设计的要求:

1. 最大公约数

问题:求两个自然数的最大公约数。
这两个都是基础的数学问题,最大公约数指两个数字公共的约数中最大的,例如数字6的约数有1、2、3、6,数字9的约数有1、3、9,则数字6和数字9的公共约数有1和3,其中3是最大的公约数。

第一种思路:从1开始循环,每次把符合要求(即同时是两个数字的约数)的值都存储起来,那么最后一个存储起来的就是最大的约数。
则实现的代码如下:

  1. int n = 6;
  2. int m = 9;
  3. int result = 1;
  4. for(int i = 1;i <= n;i++){
  5. if((n % i == 0) && (m % i == 0)){
  6. result = i;
  7. }
  8. }
  9. System.out.println(result);

第二种思路:从两个数字中最小的数字开始循环,每次减1,那么第一次得到的公共约数就是所求的最大公约数。

  1. int n = 6;
  2. int m = 9;
  3. int result = n > m ?m : n;
  4. for(int i = result;i >= 1;i--){
  5. if((n % i == 0) && (m % i == 0)){
  6. result = i;
  7. break; //结束循环
  8. }
  9. }
  10. System.out.println(result);
2. 百元百鸡问题

问题描述:每只母鸡3元,每只公鸡4元,每只小鸡0.5元,如果花100元钱买100只鸡,请问有哪些可能?说明:每种鸡的数量都可以为零。

参考代码:

  1. for(int i = 0;i <= 100;i++){ //母鸡数量
  2. for(int j = 0;j <= 100;j++){ //公鸡数量
  3. for(int k = 0;k <= 100;k++){ //小鸡数量
  4. //判断数量是否为100,以及金额是否为100
  5. if((i +j + k == 100) && (i * 3 + j * 4 + k * 0.5 == 100)){
  6. System.out.println("母鸡数量:" + i + " 公鸡数量:" + j + " 小鸡数量" + k);
  7. }
  8. }
  9. }
  10. }
3. 喝汽水问题

问题:共有1000瓶汽水,每喝完后一瓶得到的一个空瓶子,每3个空瓶子又能换1瓶汽水,喝掉以后又得到一个空瓶子,问总共能喝多少瓶汽水,最后还剩余多少个空瓶子?

参考代码:

  1. int num = 1000; //汽水数量
  2. int drinkNum = 0; //喝掉的汽水数量
  3. int emptyNum = 0; //空瓶子的数量
  4. while(num > 0){ //有汽水可以喝
  5. num--; //喝掉一瓶
  6. emptyNum++; //空瓶子数量增加1
  7. drinkNum++; //喝掉的汽水数量增加1
  8. if(emptyNum == 3){ //有3个空瓶子,则去换
  9. num++; //汽水数量增加1
  10. emptyNum = 0; //空瓶子数量清零
  11. }
  12. }
  13. System.out.println("总共喝掉瓶数:" + drinkNum);
  14. System.out.println("剩余空瓶子数:" + emptyNum);
4. 水仙花数

问题:水仙花数指三位数中,每个数字的立方和和自身相等的数字,例如370,3 × 3 × 3 + 7 × 7 × 7 + 0 × 0 × 0 =370,请输出所有的水仙花数。

参考代码:

  1. for(int i = 100;i < 1000;i++){ //循环所有三位数
  2. int a = i % 10; //个位数字
  3. int b = (i / 10) % 10; //十位数字
  4. int c = i / 100; //百位数字
  5. //判断立方和等于自身
  6. if(a * a * a + b * b * b + c * c * c == i){
  7. System.out.println(i);
  8. }
  9. }
5. 求素数问题

问题:求出1000以内的所有素数,素数即质数,只能被1和本身整除的数,最小的质数是2。

参考代码:

  1. for(int i = 2; i <= 1000; i++) {
  2. boolean isPrime = true;
  3. // Math.sqrt(i):开平方方法
  4. for(int j = 2; j < Math.sqrt(i); j++) {
  5. if(i != j && i % j == 0) {
  6. isPrime = false;
  7. break;
  8. }
  9. }
  10. if(isPrime) {
  11. System.out.println(i);
  12. }
  13. }
6. 输出数列

要求:输出1 1 2 3 5 8 13……这样的数列,输出该数列的前20个数字。

参考代码:

  1. int[] num = new int[20];
  2. num[0] = 1;
  3. num[1] = 1;
  4. //循环初始化
  5. for(int i = 2;i < num.length;i++){
  6. num[i] = num[i 1] + num[i 2];
  7. }
  8. //循环输出
  9. for(int i = 0;i < num.length;i++){
  10. System.out.print(num[i] + " ");
  11. }
  12. System.out.println(); //换行
7. 歌手打分

要求:在歌唱比赛中,共有10位评委进行打分,在计算歌手得分时,去掉一个最高分,去掉一个最低分,然后剩余的8位评委的分数进行平均,就是该选手的最终得分。如果已知每个评委的评分,求该选手的得分。

参考代码:

  1. int[] score = {90,78,90,96,67,86,78,92,79,85}; //评委打分
  2. int sum = score[0]; //存储和
  3. int max = score[0]; //存储最大值
  4. int min = score[0]; //存储最小值
  5. for(int i = 1;i < score.length;i++) {
  6. sum += score[i]; //求和
  7. //获得最大值
  8. if(max < score[i]) {
  9. max = score[i];
  10. }
  11. //获得最小值
  12. if(min > score[i]) {
  13. min = score[i];
  14. }
  15. }
  16. //计算平均分
  17. double avg = (sum max min) / 8.0;
8. 寻找孤立数字

需求:给定一个数组,数组内的数两两相同,只有一个数是孤立的,用最快的方式找出这个数。

参考代码:

  1. int[] array = {1, 2, 3, 2, 3, 1, 4};
  2. int single = 0;
  3. for(int i = 0; i < array.length; i++) {
  4. boolean isSingle = true;
  5. for(int j = 0; j < array.length; j++) {
  6. if(j != i && array[i] == array[j]) {
  7. isSingle = false;
  8. break;
  9. }
  10. }
  11. if(isSingle) {
  12. single = array[i];
  13. break;
  14. }
  15. }
  16. // 第二种方法
  17. int[] array = {1, 2, 3, 2, 3, 1, 4};
  18. int single = array[0];
  19. for(int i = 1; i < array.length; i++) {
  20. single ^= array[i];
  21. }
9. 进制转换

将一个整型数据转换成二进制字符串。

参考代码:

  1. public static String toBinary(int value) {
  2. StringBuilder build = new StringBuilder();
  3. if(value > 0) {
  4. build.append(0);
  5. } else {
  6. build.append(1);
  7. value = -value;
  8. }
  9. for(int i = 30; i >= 0; i--) {
  10. build.append(value >> i & 1);
  11. // 和1做与操作之后,该位置之前的数全部干掉
  12. }
  13. return build.toString();
  14. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注