- 浏览: 19163 次
- 性别:
- 来自: 青岛
最新评论
文章列表
原文链接:[使用Feign接口实现文件上传的解决方案](https://blog.kdyzm.cn/post/176)
一般的情况下,后端有个微服务,暴露出一个文件上传的restful接口给前端,前端调用该接口获取上传后的链接以及oss key值完成上传。假设提供restful接口的这个服务叫做A,现在有个微服务B有个本地文件,需要将本地文件调用A文件文件上传接口上传到文件服务器,该如何做?
一般情况下,一个文件上传的restful接口如下所示:
``` java
@PostMapping("/upload")
public WrapperResult<Uploa ...
Java中有三种代码块,三种代码块中的代码执行的优先级是面试中会被提问到的问题。
三种代码块:静态代码块、方法代码块、普通代码块
其中,普通代码块是比较少见而且比较少使用的。
package com.kdyzm.demo;
public class Main {
static {
System.out.println("静态代码块执行");
}
public Main(){
System.out.println("Main 构造方法");
}
{
System.out.println("普通代 ...
学习Java有几年了,但是还是有些貌似“简单”的代码值得仔细推敲,仔细记录这些点点滴滴还是很有趣的!
1.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
...
一、核心思想
和Prime算法的思想几乎相同,Prime算法中是使用lowcost数组保存到生成树之间的最短距离,Dijkstra算法中使用lowcost数组保存到第一个节点的最短路径。
二、和Prime算法的不同之处
Dijkstra算法和Prime算法相似度达到了99%,和Prime算法相比,Dijkstra算法有以下几点不同之处:
1. 最大的不同之处是lowcost数组的刷新方式不同,Prime算法的刷新方式:
for(int j=1;j<=nodeCount;j++){
if(lowcost[j]!=-1 ...
一、Kruskal算法核心
Kruskal算法和Prime算法一样也是计算最小生成树的一种算法。考虑问题的出发点: 为使生成树上边的权值之和达到最小,则应使生成树中每一条边的权值尽可能地小。
具体做法: 先构造一个只含 n 个顶点的子图 SG,然后从权值最小的边开始,若它的添加不使SG 中产生回路,则在 SG 上加上这条边,如此重复,直至加上 n-1 条边为止。
算法演示
二、代码实现(Java版)
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
...
一、问题
最小生成树解决的问题如下所示:
假设要在 n 个城市之间建立通讯联络网,则连通 n 个城市只需要修建 n-1条线路,如何在最节省经费的前提下建立这个通讯网?
使用Prime算法构造最小生成树,将生成树上的边的权值累加即可得到最小值。
二、Prime算法核心思想
取图中任意一个顶点 v 作为生成树的根,之后往生成树上添加新的顶点 w。在添加的顶点 w 和已经在生成树上的顶点v 之间必定存在一条边,并且该边的权值在所有连通顶点 v 和 w 之间的边中取值最小。之后继续往生成树上添加顶点,直至生成树上含有 n-1 个顶点为止。
...
DFS(Depth-First-Search),中文名称为“深度优先搜索”,是纵向遍历图的一种递归算法。
需求:输入edgeCount、startNode,然后输入edgeCount组数据,每组数据有两个数node1与node2,表示一条无向边,最后使用DFS算法输出遍历图的结果,数和数之间使用空格隔开。
一、Java代码
import java.util.Scanner;
class Node{
int nodeValue;
Node next=null;
}
public class DFS{
private static boolean[ ...
BFS(Breadth First Search),中文名为宽度优先搜索,是横向遍历图的一种算法;这种算法必须借助队列才能够实现。
需求:输入edgeCount,startNode,edgeCount代表图有多少条边,startNode代表遍历的起点,接下来输入edgeCount组数据,每组有两个数node1与node2,代表一条边;最后输出BFS算法得到的序列,数和数之间使用空格隔开。
一、实现代码
import java.util.Scanner;
import java.util.Queue;
import java.util.LinkedList;
class Nod ...
线性表逆序链表使用Java实现,实现思路和C语言中的实现思路一模一样,不赘述;和顺序链表不同的是,逆序链表不需要“尾指针”,这样就少了tail节点的定义;另外逆序链表中的head节点不能存储数据,它用来引导每个节点的插入位置。
一、代码实现
import java.util.Scanner;
class Node{
int data;
Node next=null;
}
public class ReverseLinkedList{
public static void main(String args[]){
...
使用Java实现顺序链表,其思路和使用C语言的思路一模一样,但是由于在Java中没有指针,实现起来还是有很大的区别。
一、实现代码
import java.util.Scanner;
class Node{
int data;
Node next=null;
}
public class OrderedLinkedList{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in ...
使用二叉排序树查找效率也非常高,当然有更稳定的二叉平衡树,但是实现起来比较困难,所以这里只实现了二叉排序树;二叉排序树的特点如下:
左子树中的所有节点值都小于父节点值
右子树中的所有节点值都大于父节点值
所有节点不允许出现重复,否则会破坏二叉排序树的数据结构
二叉排序树的中序遍历的结果就是所有元素的排序结果
二叉排序树是二叉树
所以,使用二叉排序树不仅仅能够实现快速查找,而且也能够实现排序。
一、使用二叉排序树实现排序(非递归建树)
package com.kdyzm.bitsorttree;
import java.util.Scanner;
...
二分查找的核心思想就是根据有序数组的中间值判断目标所在的区间,每比较一次目标所在的范围都会缩小一半,当目标值和中间值相等的时候就找到了该目标值对应的数组下标,查找成功;当low>heigh的时候,就表明没有找到对应的元素,查找失败。
一、递归方式的二分查找
import java.util.Scanner;
public class BitSearch{
public static void main(String args[]){
Scanner scanner=new Scanner(System.in);
...
二叉树的创建有两种方式,一种是递归方式创建,另外一种是非递归方式创建,其中后者比较难,这里使用递归方式创建二叉树。
要求:使用前序序列的方式输入若干个字符,如"
abc,,de,g,,f,,,
",其中,','表示是空节点,根据该字符序列输出前序遍历字符串,中续遍历字符串,后序遍历字符串。
分析问题,如果使用C语言比较方便实现,使用java稍微麻烦一点,需要手动结束输入,这里使用了标识变量flag判断输入的结束。
package com.kdyzm.bittree;
class Node {
char data;
Node lchild; ...
堆排序核心思想是根据现有数组构建大顶堆或者小顶堆,堆顶元素就是该数组的最大值(大顶堆)或者最小值(小顶堆);将该最值按照顺序放到一个“有序区”中,然后将“无序区”中最后一个元素放到堆顶,不断调整使其满足大顶堆或者小顶堆的条件,调整过后处于堆顶的就是剩余无序区中的最大值或者最小值,将该值放入到有序区中......不断如此这般的调整,最终当“无序区”中的元素数量为0的时候,“有序区”中的所有元素就是最终的排序结果。
根据上述描述,在堆排序中有两个问题需要解决:
如何初始化堆(如何根据现有数组构建堆结构)
如何调整数组使其满足堆结构的要求。
预备知识点:
1.大顶 ...
希尔排序是对直接插入排序算法的一种改进,其基本原理就是让一个无序的数列变得“基本有序”,那么在最后进行直接插入排序的时候时间复杂度将会降低很多(在理想情况下,如果一个数列是有序的,那么使用直接插入排序的算法时间复杂度为O(n));希尔排序算法的效率和“步长”的定义息息相关,但是如何给出一个步长使得希尔排序算法的效率最高,是非常困难的。
import java.util.Scanner;
public class ShellInsertSort{
public static void main(String args[]){
Scanner scanner=new ...