摘要
请实现有重复数字的升序数组的二分查找
package 牛客网名企面试笔试问题2021;
import org.junit.Test;
import java.util.Arrays;
/**
* @Classname 二分查找
* @Description TODO
* @Date 2021/3/8 9:40
* @Created by xjl
*/
public class 二分查找 {
@Test
public void test() {
int search = search1(new int[]{1, 2, 2, 3, 4}, 2);
System.out.println(search);
}
/**
* @description TODO 没有重复的查找
* @param: nums
* @param: target
* @date: 2021/3/8 9:52
* @return: int
* @author: xjl
*/
public int search(int[] nums, int target) {
int i = Arrays.binarySearch(nums, target);
return i;
}
/**
* @description TODO 有重复的查找
* @param: nums
* @param: target
* @date: 2021/3/8 9:53
* @return: int
* @author: xjl
*/
public int search1(int[] nums, int target) {
int i = Arrays.binarySearch(nums, target);
while (i > 0) {
if (nums[i]!=nums[i-1]){
break;
}
i--;
}
return i;
}
}
二叉树的景象
package 牛客网名企面试笔试问题2021;
/**
* @Classname 二叉树的景象文件
* @Description TODO
* @Date 2021/3/8 9:54
* @Created by xjl
*/
public class 二叉树的景象文件 {
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public TreeNode Mirror(TreeNode pRoot) {
if (pRoot == null) return pRoot;
if (pRoot.left == null && pRoot.right == null){
return pRoot;
}
//处理根节点,交换左右节点
TreeNode temp=pRoot.left;
pRoot.left=pRoot.right;
pRoot.right=temp;
//处理左子树
Mirror(pRoot.left);
//处理右子树
Mirror(pRoot.right);
return pRoot;
}
}
数字的划分
package 牛客网名企面试笔试问题2021;
import org.junit.Test;
/**
* @Classname 数字的划分
* @Description TODO
* @Date 2021/3/8 10:06
* @Created by xjl
*/
public class 数字的划分 {
public int divideNumber(int n, int k) {
int[][] dp = new int[n + 1][k + 1];
dp[0][0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
if (i >= j) {
dp[i][j] = dp[i - 1][j - 1] + dp[i - j][j];
}
}
}
return dp[n][k];
}
private int ans = 0;
/**
* @description TODO 同时比较认同的是的采用的是的dfs的方法
* @param: n
* @param: k
* @date: 2021/3/8 10:41
* @return: int
* @author: xjl
*/
public int divideNumber2(int n, int k) {
dfs(1, n, k);
return ans;
}
private void dfs(int i, int n, int k) {
if (n < i) return;
if (k == 1) {
System.out.println(i+" "+" "+n+" "+k);
ans++;
return;
}
while (i <= n) {
dfs(i, n - i, k - 1);
i++;
}
}
@Test
public void test(){
divideNumber2(7,3);
}
}
零钱的兑换
package 牛客网名企面试笔试问题2021;
/**
* @Classname 零钱兑换
* @Description TODO
* @Date 2021/3/8 10:53
* @Created by xjl
*/
public class 零钱兑换 {
int res = Integer.MAX_VALUE;
public int coinChange(int[] coins, int amount) {
if(coins.length == 0){
return -1;
}
findWay(coins,amount,0);
// 如果没有任何一种硬币组合能组成总金额,返回 -1。
if(res == Integer.MAX_VALUE){
return -1;
}
return res;
}
public void findWay(int[] coins,int amount,int count){
if(amount < 0){
return;
}
if(amount == 0){
res = Math.min(res,count);
}
for(int i = 0;i < coins.length;i++){
findWay(coins,amount-coins[i],count+1);
}
}
}