33.求和的重载

在同一个类中,分别定义求两个整数的方法 和 三个小数之和的方法。 并执行代码,求出结果

重载满足的几个条件:

  1. 方法名相同
  2. 参数列表不同(数据类型,个数,顺序)
  3. 返回值无关
public static int sum(int a,int b) {
    return a+b;
}
 
public static double sum(double a,double b,double c) {
    return a+b+c;
}

34.求1!+2!+3!+4!+........+n!的和

/**
 
     * 1!+2!+3!+.....+n!
 
     * @param n
 
     * @return
 
     */
 
    public static int facSum(int n) {
 
        int sum = 0;
 
        for (int i = 1; i <= n; i++) {
            //fac为 求指定数字的阶乘的函数
            sum += fac(i);
 
        }
 
        return sum;
 
    }
 
 
 
    /**
 
     * 求i!的阶乘
 
     * @param i
 
     * @return
 
     */
 
    public static int fac( int i) {
 
        int tmp = 1;
 
        for (int j = 1; j <= i; j++) {
 
            tmp *= j;
 
        }
 
        return tmp;
 
    }
 
 
 
    public static void main(String[] args) {
 
        int ret = facSum(5);
 
        System.out.println(ret);
 
    }

35.找出出现一次的数字

有一组数据,只有一个数字是出现一次,其他是两次,请找出这个数字。

class Solution {
	vector<int> onlyones(vector<int>nums) {
	
		int count = 0;
		int i = 0;	
		int cur=nums[i];
		vector<int>res;
		while (i<nums.size()) {
			if (nums[i] == cur) { 
				count++;
				if (count == 2) {
					cur = nums[++i];
					count = 1;
				}
				i++;
			}
			else {
				res.push_back(cur);
				cur = nums[i++];
				count = 1;
			}
		}
		return res;
	}
};

36.求最大值方法的重载

在同一个类中定义多个方法:要求不仅可以求2个整数的最大值,还可以求3个小数的最大值?

重载:

  1. 方法名相同
  2. 参数列表不同(数据类型,个数,顺序)
  3. 返回值无关

本题可以借助Java原生类Math当中的max方法求最大值,当然也可以自己通过If else进行比较。

Math的使用 不需要导入相关的包 

public static int max(int a,int b) {
    return Math.max(a,b);
}
 
public static double max(double a,double b,double c) {
 
    double m = Math.max(a,b);
    return Math.max(m,c);
}

37.求 N 的阶乘 

public static int fac( int n) {
 
      int tmp = 1;
 
      for (int j = 1; j <= n; j++) {
 
          tmp *= j;
 
      }
 
      return tmp;
 
  }

38.求斐波那契数列的第n项。(迭代实现)

/**
 
   * 求菲薄那切数列的第n项
 
   * @param n
 
   * @return
 
   */
 
  public static int fib(int n) {
      if(n == 1 || n == 2 ) {
           return 1;
      }
      int f1 = 1;
 
      int f2 = 1;
 
      int f3 = 1;
 
      for (int i = 3; i <= n; i++) {
 
          f3 = f1+f2;
 
          f1 = f2;
 
          f2 = f3;
 
      }
 
      return f3;
 
  }

39.写一个递归方法,输入一个非负整数,返回组成它的数字之和

要计算123的每一位,主要在于如何得到每一位。在前面的习题中我们知道,除10 , 模10.可以做到。

如下图,在执行n=123的时候,先执行add(123/10)也就是add(12)这个函数,等最后回来之后,才会把n=123时候的n%10算完。

Java刷算法题常用的API java刷题小程序_数组

public static int add(int n) {
    if(n > 10) {
        return add(n/10)+n%10;
    }
    return n%10;
}

40.递归求斐波那契数列的第 N 项

public static int fib(int n) {
 
      if(n == 1 || n == 2) {
 
          return 1;
 
      }
 
      return fib(n-1)+fib(n-2);
 
  }

41.按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4) (递归)

假设用F(n) 代表 要顺序打印n的每一位,如果n是一个1位数,直接输出,如果n是2位数以上。

如:

123 相当于先打印12的每一位,再打印3

12 相当于先打印1的每一位,再打印2

1 只有一位数,直接打印。

依次回退打印完,每一位即可。

public static void print(int n) {
      if(n <= 9) {
          System.out.println(n%10);
          return;
      }
      print(n/10);
      System.out.println(n%10);
  }

42.递归求 1 + 2 + 3 + ... + 10

public static int add(int n) {
 
      if(n == 1) {
          return 1;
      }
      return n+add(n-1);
  }

43.递归求 N 的阶乘

/**
   * 阶乘的代码!
 
   * 递归的优点:代码量少
   * @param n
 
   * @return
 
   */
 
  public static int fac(int n) {
      if(n == 1) {
          return 1;
      }
      return n * fac(n-1);
  }

44.改变原有数组元素的值

实现一个方法 transform, 以数组为参数, 循环将数组中的每个元素 乘以 2 , 并设置到对应的数组元素上. 例如 原数组为 {1, 2, 3}, 修改之后为 {2, 4, 6}

//方式一:扩大的还是原来的数组,这样做的不好的地方是,改变了原来数组的值
public static void func2(int[] array) {
 
      for (int i = 0; i < array.length; i++) {
 
          array[i] = array[i]*2;
 
      }
 
  }
 
 
//方式二:扩大的新的数组,没有修改原来的值
public static int[] func3(int[] array) {
 
    int[] tmp = new int[array.length];//
 
    for (int i = 0; i < array.length; i++) {
 
        tmp[i] = array[i]*2;
 
    }
 
    return tmp;
 
}

45.创建一个 int 类型的数组, 元素个数为 100, 并把每个元素依次设置为 1 - 100

public static void main(String[] args) {
    int[] array = new int[100];
    for (int i = 0; i < array.length; i++) {
        //题目要求赋值1-100,这里利用下标的值,然后+1即可。
        array[i] = i+1;
    }
}

46.两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9

输出:[0,1]

解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

public int[] twoSum(int[] nums, int target) {
    int[] result = new int[2];
    // 双指针i和j,i从前向后遍历,j从后向i遍历,若arr[i]+arr[j]=target,即为题解
    for (int i = 0; i < nums.length - 1; i++) {
        for (int j = nums.length - 1; j > i; j--) {
            if (nums[i] + nums[j] == target) {
                result[0] = i;
                result[1] = j;
            }
        }
    }
    return result;
}

 47.给定一个整型数组, 实现冒泡排序(升序排序)

public static void bubbleSort(int[] array) {
    boolean flg = false;
    //1、确定一个趟数
    for (int i = 0; i < array.length-1; i++) {
        for (int j = 0; j < array.length-1-i; j++) {
            if(array[j] > array[j+1]) {
                int tmp = array[j];
                array[j] = array[j+1];
                array[j+1] = tmp;
                flg = true;
            }
        }
        if(flg == false) {
            //没有交换
            break;
        }
    }
}

48.给定一个整型数组, 判定数组是否有序(递增)

49.定一个有序整型数组, 实现二分查找

Java刷算法题常用的API java刷题小程序_数组_02

public static int binarySearch(int[] array,int key) {
    int left = 0;
    int right = array.length-1;
    while (left <= right) {
        int mid = (left+right)/2;
        if(array[mid] == key) {
            return mid;
        }else if(array[mid] < key) {
            left = mid+1;
        }else {
            right = mid-1;
        }
    }
    return -1;//代表没有找到这个数字
}

 50.实现一个方法 copyOf, 对一个整型数组进行拷贝, 得到一个新的数组.