【C++代码】最接近的三数之和,括号生成,合并两个有序链表,合并 K 个升序链表

news2024/10/7 11:28:33

题目:最长公共前缀

  • 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""

  • class Solution {
    public:
        string longestCommonPrefix(vector<string>& strs) {
            string res="";
            int index = 0; 
            for(int i=0;i<strs[0].size();i++){
                char temp = strs[0][i];
                for(int j=1;j<strs.size();j++){
                    if(strs[j][i] != temp ){
                        return strs[0].substr(0,i);
                    }
                }
            }
            return strs[0];
        }
    };
    
  • 纵向扫描时,从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。

    • 在这里插入图片描述
  • 时间复杂度:O(mn),其中 m 是字符串数组中的字符串的平均长度,n 是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。空间复杂度:O(1)。使用的额外空间复杂度为常数。

  • 对于问题 LCP(Si⋯Sj),可以分解成两个子问题 LCP(Si…Smid) 与 LCP(Smid+1…Sj),其中 m i d = i + j 2 mid=\frac{i+j}{2} mid=2i+j。对两个子问题分别求解,然后对两个子问题的解计算最长公共前缀,即为原问题的解。

  • class Solution {
    public:
    
        string pr(const vector<string> &s,int start,int end){
            if(start==end){
                return s[start];
            }else{
                int mid = start+(end-start)/2;
                string left = pr(s,start,mid);
                string right = pr(s,mid+1,end);
                cout<<left<<" "<<right<<endl;
                return camp(left,right);
            }
        }
        string camp(const string &left,const string &right){
            int min_len = min(left.size(),right.size());
            for(int i=0;i<min_len;i++){
                if(left[i]!=right[i]){
                    return left.substr(0,i);
                }
            }
            return left.substr(0,min_len);
        }
        string longestCommonPrefix(vector<string>& strs) {
            if(!strs.size()){
                return "";
            }else{
                return pr(strs,0,strs.size()-1);
            }       
        }
    };
    
    
    

题目:最接近的三数之和

  • 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在恰好一个解。

  • 借助双指针,我们就可以对枚举的过程进行优化。我们用 pb 和 pc 分别表示指向 b 和 c 的指针,初始时,pb 指向位置 i+1,即左边界;pc 指向位置 n−1,即右边界。在每一步枚举的过程中,我们用 a+b+c 来更新答案,并且:

    • 如果 a+b+c≥target,那么就将 pc 向左移动一个位置;
    • 如果 a+b+c<target,那么就将 pb 向右移动一个位置。
  • 如果 a+b+c≥target,并且我们知道 pb 到 pc 这个范围内的所有数是按照升序排序的,那么如果 pc 不变而 pb 向右移动,那么 a+b+c 的值就会不断地增加,显然就不会成为最接近 target 的值了。因此,我们可以知道在固定了 pc 的情况下,此时的 pb 就可以得到一个最接近 target 的值,那么我们以后就不用再考虑 pc 了,就可以将 pc 向左移动一个位置。

  • class Solution {
    public:
        int threeSumClosest(vector<int>& nums, int target) {
            sort(nums.begin(),nums.end());
            int len_nums=nums.size();
            int res = 1e7;
            // 根据差值的绝对值来更新答案
            auto update=[&](int cur){
                if(abs(cur-target)<abs(res-target)){
                    res=cur;
                }
            };
            for(int i=0;i<len_nums;i++){
                if(i>0 && nums[i]==nums[i-1]){
                    continue;
                }
                int pb=i+1,pc=len_nums-1;
                while(pb<pc){
                    int sum=nums[i]+nums[pb]+nums[pc];
                    if(sum==target){
                        return target;
                    }
                    update(sum);
                    if(sum>target){
                        int newpc = pc-1;
                        while(pb<newpc && nums[newpc] == nums[pc]){
                            newpc--;
                        }
                        pc = newpc;
                    }else{
                        int newpb = pb+1;
                        while(newpb<pc && nums[newpb] == nums[pb]){
                            newpb++;
                        }
                        pb=newpb;
                    }
                }
            }
            return res;
        }
    };
    
  • 时间复杂度:O(N2),其中 N 是数组 nums 的长度。我们首先需要 O(Nlog⁡N) 的时间对数组进行排序,随后在枚举的过程中,使用一重循环 O(N) 枚举 a,双指针 O(N) 枚举 b 和 c,故一共是 O(N2)。空间复杂度:O(log⁡N)。排序需要使用 O(log⁡N) 的空间。然而我们修改了输入的数组 nums,在实际情况下不一定允许,因此也可以看成使用了一个额外的数组存储了 nums 的副本并进行排序,此时空间复杂度为 O(N)。

题目:合并两个有序链表

  • 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

  • 在这里插入图片描述

  • /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode() : val(0), next(nullptr) {}
     *     ListNode(int x) : val(x), next(nullptr) {}
     *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     * };
     */
    class Solution {
    public:
        ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
            ListNode *res =new ListNode();
            ListNode *head = res;
            while(list1 && list2){
                if(list1->val<list2->val){
                    ListNode *temp1 = new ListNode(list1->val);
                    res->next = temp1;
                    list1 = list1->next;
                }else{
                    ListNode *temp2 = new ListNode(list2->val);
                    res->next = temp2;
                    list2 = list2->next;
                }
                res = res->next;
            }
            if(list1){
                res->next = list1;
            }
            if(list2){
                res->next = list2;
            }
            return head->next;
        }
    };
    
  • 时间复杂度:O(n+m),其中 n 和 m 分别为两个链表的长度。因为每次循环迭代中,l1 和 l2 只有一个元素会被放进合并链表中, 因此 while 循环的次数不会超过两个链表的长度之和。所有其他操作的时间复杂度都是常数级别的,因此总的时间复杂度为 O(n+m)。空间复杂度:O(1)。我们只需要常数的空间存放若干变量。

  • 如果 l1 或者 l2 一开始就是空链表 ,那么没有任何操作需要合并,所以我们只需要返回非空链表。否则,我们要判断 l1 和 l2 哪一个链表的头节点的值更小,然后递归地决定下一个添加到结果里的节点。如果两个链表有一个为空,递归结束。

  • /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode() : val(0), next(nullptr) {}
     *     ListNode(int x) : val(x), next(nullptr) {}
     *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     * };
     */
    class Solution {
    public:
        ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
            if(!list1){
                return list2;
            }else if(!list2){
                return list1;
            }else if(list1->val < list2->val){
                list1->next = mergeTwoLists(list1->next,list2);
                return list1;
            }else{
                list2->next = mergeTwoLists(list1,list2->next);
                return list2;
            }
    
        }
    };
    
  • 时间复杂度:O(n+m),其中 n 和 m 分别为两个链表的长度。因为每次调用递归都会去掉 l1 或者 l2 的头节点(直到至少有一个链表为空),函数 mergeTwoList 至多只会递归调用每个节点一次。因此,时间复杂度取决于合并后的链表长度,即 O(n+m)。

  • 空间复杂度:O(n+m),其中 n 和 m 分别为两个链表的长度。递归调用 mergeTwoLists 函数时需要消耗栈空间,栈空间的大小取决于递归调用的深度。结束递归调用时 mergeTwoLists 函数最多调用 n+m 次,因此空间复杂度为 O(n+m)

题目:括号生成

  • 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

  • 为了生成所有序列,我们可以使用递归。长度为 n 的序列就是在长度为 n−1 的序列前加一个 ‘(’ 或 ‘)’。为了检查序列是否有效,我们遍历这个序列,并使用一个变量 balance 表示左括号的数量减去右括号的数量。如果在遍历过程中 balance 的值小于零,或者结束时 balance 的值不为零,那么该序列就是无效的,否则它是有效的。

  • class Solution {
    public:
        bool valid(const string &str){
            int temp=0;
            for(char c:str){
                if(c=='('){
                    temp++;
                }else{
                    temp--;
                }
                if(temp<0){
                    return false;
                }
            }
            return temp==0;
        }
        void generate(string &curr,int n,vector<string> &res){
            if(n==curr.size()){
                if(valid(curr)){
                    res.push_back(curr);
                }
                return ;
            }
            curr += '(';
            generate(curr,n,res);
            curr.pop_back();
            curr += ')';
            generate(curr,n,res);
            curr.pop_back();
        }
        vector<string> generateParenthesis(int n) {
            vector<string> res;
            string curr;
            generate(curr,n*2,res);
            return res;
        }
    };
    
  • 时间复杂度: O ( 2 2 n n ) O(2^{2n}n) O(22nn),对于 2 2 n 2^{2n} 22n 个序列中的每一个,我们用于建立和验证该序列的复杂度为 O(n)。空间复杂度:O(n),除了答案数组之外,我们所需要的空间取决于递归栈的深度,每一层递归函数需要 O(1) 的空间,最多递归 2n 层,因此空间复杂度为 O(n)。

  • 如果左括号数量不大于 n,我们可以放一个左括号。如果右括号数量小于左括号的数量,我们可以放一个右括号。

  • class Solution {
    public:
        void track(vector<string> &res,string &cur,int n ,int open,int close){
            if(cur.size()==2*n){
                res.push_back(cur);
                return ;
            }
            if(open<n){
                cur.push_back('(');
                track(res,cur,n,open+1,close);
                cur.pop_back();
            }
            if(close < open){
                cur.push_back(')');
                track(res,cur,n,open,close+1);
                cur.pop_back();
            }
        }
        vector<string> generateParenthesis(int n) {
            vector<string> res;
            string curr;
            track(res,curr,n,0,0);
            return res;
        }
    };
    
  • 时间复杂度: O ( 4 n n ) O(\dfrac{4^n}{\sqrt{n}}) O(n 4n),在回溯过程中,每个答案需要 O(n) 的时间复制到答案数组中。空间复杂度:O(n),除了答案数组之外,我们所需要的空间取决于递归栈的深度,每一层递归函数需要 O(1) 的空间,最多递归 2n 层,因此空间复杂度为 O(n)。

题目:合并 K 个升序链表

  • 给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。

  • 可以想到一种最朴素的方法:用一个变量 res 来维护以及合并的链表,第 i 次循环把第 i 个链表和 ans 合并,答案保存到 res 中。

  • /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode() : val(0), next(nullptr) {}
     *     ListNode(int x) : val(x), next(nullptr) {}
     *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     * };
     */
    class Solution {
    public:
        ListNode* mergeTwo(ListNode *a,ListNode *b){
            if((!a) || (!b)){
                return a?a:b;
            }
            ListNode head,*tail = &head,*ap=a,*bp=b;
            while(ap && bp){
                if(ap->val < bp->val){
                    tail->next = ap;
                    ap = ap->next;
                }else{
                    tail->next =bp;
                    bp = bp->next;
                }
                tail = tail->next;
            }
            tail->next = (ap?ap:bp);
            return head.next;
        }
        ListNode* mergeKLists(vector<ListNode*>& lists) {
            ListNode *res=nullptr;
            for(size_t i=0;i<lists.size();i++){
                res = mergeTwo(res,lists[i]);
            }
            return res;
        }
    };
    
  • 使用优先队列合并:需要维护当前每个链表没有被合并的元素的最前面一个,k 个链表就最多有 k 个满足这样条件的元素,每次在这些元素里面选取 val 属性最小的元素合并到答案中。在选取最小元素的时候,我们可以用优先队列来优化这个过程。

  • /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode() : val(0), next(nullptr) {}
     *     ListNode(int x) : val(x), next(nullptr) {}
     *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     * };
     */
    class Solution {
    public:
        struct sta{
            int val;
            ListNode *ptr;
            bool operator < (const sta &r) const{
                return val >r.val;
            }
        };
        priority_queue <sta> q;
        ListNode* mergeKLists(vector<ListNode*>& lists) {
            for(auto node:lists){
                if(node){
                    q.push({node->val,node});
                }
            }
            ListNode head,*tail = &head;
            while(!q.empty()){
                auto temp = q.top();
                q.pop();
                tail->next = temp.ptr;
                tail = tail->next;
                if(temp.ptr->next){
                    q.push({temp.ptr->next->val,temp.ptr->next});
                }
            }
            return head.next;
        }
    };
    
  • 时间复杂度:考虑优先队列中的元素不超过 k 个,那么插入和删除的时间代价为 O(log⁡k),这里最多有 kn 个点,对于每个点都被插入删除各一次,故总的时间代价即渐进时间复杂度为 O(kn×log⁡k)。空间复杂度:这里用了优先队列,优先队列中的元素不超过 k 个,故渐进空间复杂度为 O(k)。

  • 将 k 个链表配对并将同一对中的链表合并;第一轮合并以后, k 个链表被合并成了$ \frac{k}{2} $ 个链表,平均长度为 2 n k \frac{2n}{k} k2n ,然后是 k 4 \frac{k}{4} 4k 个链表,$ \frac{k}{8}$ 个链表等等;重复这一过程,直到我们得到了最终的有序链表。

    • 在这里插入图片描述
  • /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode() : val(0), next(nullptr) {}
     *     ListNode(int x) : val(x), next(nullptr) {}
     *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     * };
     */
    class Solution {
    public:
        ListNode* merge(ListNode *a,ListNode *b){
            if((!a) || (!b)){
                return a?a:b;
            }
            ListNode head,*tail=&head,*ap=a,*bp=b;
            while(ap && bp){
                if(ap->val < bp->val){
                    tail->next = ap;
                    ap = ap->next;
                }else{
                    tail->next = bp;
                    bp = bp->next;
                }
                tail = tail->next;
            }
            tail->next = (ap?ap:bp);
            return head.next;
        }
        ListNode* opt(vector<ListNode*> &ls,int l,int r){
            if(l==r){
                return ls[l];
            }
            if(l>r){
                return nullptr;
            }
            int mid = l+(r-l)/2;
            return merge(opt(ls,l,mid),opt(ls,mid+1,r));
        }
        ListNode* mergeKLists(vector<ListNode*>& lists) {
            return opt(lists,0,lists.size()-1);
        }
    };
    
  • 时间复杂度:考虑递归「向上回升」的过程——第一轮合并 k 2 \frac{k}{2} 2k 组链表,每一组的时间代价是 O(2n);第二轮合并 $\frac{k}{4} $ 组链表,每一组的时间代价是 O(4n)…所以总的时间代价是 O ( ∑ i = 1 ∞ k 2 i × 2 i n ) = O ( k n × log ⁡ k ) O(\sum_{i = 1}^{\infty} \frac{k}{2^i} \times 2^i n) = O(kn \times \log k) O(i=12ik×2in)=O(kn×logk),故渐进时间复杂度为 O ( k n × log ⁡ k ) O(kn \times \log k) O(kn×logk)。空间复杂度:递归会使用到$ O(\log k) $空间代价的栈空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1208574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JUC】五、线程的第三种创建方式 Callable

文章目录 1、Callable概述2、FutureTask Java基础中&#xff0c;了解到的创建线程的两种方式为&#xff1a; 继承Thread类实现Runnable接口 除了以上两种&#xff0c;还可以通过&#xff1a; Callable接口&#xff08;since JDK1.5&#xff09;线程池方式 1、Callable概述 …

你的Edge浏览器难道不需要一个好看的浏览器起始页嘛

这是我登录后&#xff0c;并且上传了个人壁纸的页面 Br标签页 一 . 我们来看看界面和功能1.注册登录2.首页及右键功能3.添加小组件和app网址4.切换壁纸5. 计划页面 二 . Edge浏览器安装和chrome&#xff08;谷歌&#xff09;浏览器安装1. Edge浏览器安装2. chrome&#xff08;谷…

Ubuntu安装mysql(解决ubuntu Access denied for user ‘root‘@‘localhost‘报错)

1、安装mysql sudo apt-get install mysql-server 上述命令会安装以下包&#xff1a; apparmor mysql-client-5.7 mysql-common mysql-server mysql-server-5.7 mysql-server-core-5.7 因此无需再安装mysql-client等。安装过程会提示设置mysql root用户的密码&#xff0c;设…

Linux系统编程——进程的创建

函数名 fork&#xff1a;创建一个子进程 函数原型 pid_t fork(void); 调用该函数时&#xff0c;需包含以下头文件 #include <unistd.h>返回值 fork函数调用成功&#xff0c;返回两次PID &#xff08;1&#xff09;返回值为0&#xff0c;代表当前进程是子进程 &am…

笔记:如何用趋动云GPU线上跑AI项目实践-部署DragGan模型

1.创建项目 1&#xff09;进入趋动云用户工作台&#xff0c;在当前空间处选择注册时系统自动生成的空间&#xff08;其他空间无免费算力&#xff09;&#xff1b; 2&#xff09;点击 快速创建&#xff0c;选择 创建项目&#xff0c;创建新项目&#xff1b; 3&#xff09;填写…

【游戏开发算法每日一记】使用随机prime算法生成错综复杂效果的迷宫(C#,C++和Unity版)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

RT-Thread系列10——ETH网口设备

文章目录 1. ETH测试第一步&#xff1a;cubemx配置。第二步&#xff1a;board.h配置。第三步&#xff1a;rtthread settings配置第四步&#xff1a;以太网复位引脚设置第五步&#xff1a;修改rtthread源码第六步&#xff1a;修改 cubemx 生成的 main 函数第七步&#xff1a;编译…

【MATLAB源码-第76期】基于matlab的OCDM系统在AWGN信道下理论误码率和实际误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交线性调频分频复用&#xff08;OCDM&#xff0c;Orthogonal Chirp Division Multiplexing&#xff09;是一种无线通信技术&#xff0c;它基于啁啾信号的原理。啁啾信号是一种频率随时间变化的信号&#xff0c;通常频率是线…

Ant Design Vue Select下拉框内容显示不全问题解决

默认情况下&#xff0c;当下拉框的内容长度过长时&#xff0c;会被折叠&#xff0c;这比较影响用户体验&#xff0c;查了下文档&#xff0c;看到有一个属性可以解决这个问题&#xff1a; 没设置的下拉效果&#xff1a; 设置完之后&#xff1a;dropdownMatchSelectWidth{false}&…

在Qt设计师(Qt Designer )控件面板加入自定义控件

目录 1. 问题的提出 2. 本次开发环境说明 3. 具体实现 4. 注意的问题 5. 参考链接 1. 问题的提出 在Qt开发中&#xff0c;经常利用Qt设计师&#xff08;Qt Designer &#xff09;把界面设计好&#xff0c;将界面放到ui文件中&#xff0c;将逻辑处理放到cpp文件中&#xff…

记录第一次利用CVE-2023-33246漏洞实现RocketMQ宿主机远程代码执行的兴奋

我依然记得自己第一次发现xss漏洞时候的兴奋: 我也记得自己第一次发现sql输入时候的快乐: 直到最近我终于收获了人生的第一个远程代码执行漏洞的利用&#xff08;RCE:remote code execute&#xff09;&#xff0c;虽然这个漏洞的危害远超过了前两个&#xff0c;但是快乐不如前…

基于非对称纳什谈判的多微网电能共享运行优化策略(附带MATLAB程序)

基于非对称纳什谈判的多微网电能共享运行优化策略MATLAB程序 参考文献&#xff1a; 《基于非对称纳什谈判的多微网电能共享运行优化策略》——吴锦领 资源地址&#xff1a; 基于非对称纳什谈判的多微网电能共享运行优化策略MATLAB程序 MATLAB代码&#xff1a;基于非对称纳什…

微信小程序:tabbar、事件绑定、数据绑定、模块化、模板语法、尺寸单位

目录 1. tabbar 1.1 什么是tabbar 1.2 配置tabbar 2. 事件绑定 2.1 准备表单 2.2 事件绑定 2.3 冒泡事件及非冒泡事件 3. 数据绑定 3.1 官方文档 4. 关于模块化 5. 模板语法 6. 尺寸单位 1. tabbar 1.1 什么是tabbar 下图中标记出来的部分即为tabbar&#xff1a…

2023年华为杯数学建模E题——代码复盘(第一问)

2023年华为杯数学建模E题 代码复盘 写在最前面目录问题1a计算时间间隔思路说明代码输出结果 插值求解思路代码输出结果 绘图绘制3D图&#xff08;待修改&#xff09; 问题1b数据预处理思路代码 模型训练思路代码输出结果网格调参代码输出结果 写在最前面 超开心又有点遗憾 结果…

matlab二维曲面散点图插值方法

在 MATLAB 中&#xff0c;你可以使用以下函数进行二维曲面散点插值&#xff1a; griddata: 该函数可以在散点数据上进行二维插值&#xff0c;生成平滑的曲面。它支持多种插值方法&#xff0c;包括三次样条插值、最近邻插值、线性插值和自然邻近法插值。 scatteredInterpolant:…

《RT-DETR魔术师》专栏介绍 CSDN独家改进创新实战 专栏目录

RT-DETR魔术师专栏介绍&#xff1a; https://blog.csdn.net/m0_63774211/category_12497375.html ✨✨✨魔改创新RT-DETR &#x1f680;&#x1f680;&#x1f680;引入前沿顶会创新&#xff08;CVPR2023&#xff0c;ICCV2023等&#xff09;&#xff0c;助力RT-DETR &#…

专题知识点-二叉树-(非常有意义的一篇文章)

这里写目录标题 二叉树的基础知识知识点一(二叉树性质 )树与二叉树的相互转换二叉树的遍历层次优先遍历树的深度和广度优先遍历中序线索二叉树二叉树相关遍历代码顺序存储和链式存储二叉树的遍历二叉树的相关例题左右两边表达式求值求树的深度找数找第k个数二叉树非递归遍历代码…

微信小程序 生命周期方法 页面路由 开发示例 自定义全局数据 链接跳转

目录 1. 生命周期方法 2. 页面路由 3. 开发示例 3.1 自定义全局数据 3.2 链接跳转 1. 生命周期方法 打开app.js Page生命周期函数 下面的Page生命周期图与上面的Page生命周期函数进行对比便于理解&#xff1a; 视图线程和应用服务线程会同时运行&#xff0c;应用服务线程…

微信个人号api接口开发

请求URL&#xff1a; http://域名地址/sendFile 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId是string登录实例标识wcId是string接收…

【保姆级教程】Linux安装JDK8

本文以centos7为例&#xff0c;一步一步进行jdk1.8的安装。 1. 下载安装 官网下载链接&#xff1a; https://www.oracle.com/cn/java/technologies/downloads/#java8 上传jdk的压缩包到服务器的/usr/local目录下 在当前目录解压jdk压缩包&#xff0c;如果是其它版本&#xf…