LeetCode 887. 鸡蛋掉落-题解分析

题目来源

887. 鸡蛋掉落

题目详情

给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。

已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的楼层落下的鸡蛋都不会破。

每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。

请你计算并返回要确定 f 确切的值最小操作次数 是多少?

示例 1:

输入: k = 1, n = 2
输出: 2
解释:
鸡蛋从 1 楼掉落。如果它碎了,肯定能得出 f = 0 。
否则,鸡蛋从 2 楼掉落。如果它碎了,肯定能得出 f = 1 。
如果它没碎,那么肯定能得出 f = 2 。
因此,在最坏的情况下我们需要移动 2 次以确定 f 是多少。

示例 2:

输入: k = 2, n = 6
输出: 3

示例 3:

输入: k = 3, n = 14
输出: 4

提示:

  • 1 <= k <= 100
  • 1 <= n <= 104

题解分析

首先看到本题的题眼即“最小操作次数”就能大概猜到本题需要使用动态规划的方法进行求解。仔细看一下题目的描述,其实如果自己手动计算的话会发现没有什么特殊的规律,而且很难列举出每一种情况。

本题的解题关键在于如何在鸡蛋碎了时做出选择,我们知道,如果鸡蛋在某一层碎了,那就说明边界条件必定在该层以下,后续需要往下扔鸡蛋;如果鸡蛋在该层没碎,那说明现在还没达到边界条件,后续需要继续往上走,在更高楼层扔鸡蛋。

解法一

这里还是使用动态规划的思想来设计状态转移,我们定义dp[i][j]表示i个鸡蛋,j层楼,最坏的情况下最少需要扔多少次。状态转移方程如下:

\[d p(i, j)=\min _{0<=i<=N}\{\max \{d p(i-1, j-1), d p(i, N-j)\}+1\} \]

上述dp[i-1][j-1]表示鸡蛋在第j层碎了,此时需要往下走,因为鸡蛋碎了,所以鸡蛋个数减一;dp[i][n-j]表示鸡蛋在第j层没碎,此时需要往上走,而往上可以走的层数只剩n-j层了,鸡蛋个数不变。

基于上述思路,一种基于递归和动态规划的解法如下:

class Solution {
    int mins = -0x3f3f3f3f;
    int[][] mem;
    public int superEggDrop(int k, int n) {
        // dp[i][j]表示i个鸡蛋,j层楼,最坏的情况下最少需要扔多少次
        // dp[i][j] = min(1<=j<=n)(max(dp[i-1][j-1], dp[i][n-j]) + 1);
        mem = new int[k+1][n+1];
        for (int i=0; i<=k; i++) {
            Arrays.fill(mem[i], mins);
        }
        return dp(k, n);
    }

    public int dp(int k, int n) {
        // 只有一个鸡蛋,必然最少要扔n次
        if (k == 1) {
            return n;
        }
        // 0层楼,无论多少个鸡蛋,不用扔
        if (n == 0) {
            return 0;
        }
        if (mem[k][n] != mins) {
            return mem[k][n];
        }
        int res = 0x3f3f3f3f;
        for(int j=1; j<=n; j++) {
            res = Math.min(res, Math.max(dp(k-1, j-1), dp(k, n-j)) + 1);
        }
        mem[k][n] = res;
        return res;
    }
}

很遗憾的是,上述解法会导致超时,尽管使用了备忘录来进行递归剪枝,然而在每层递归中,还是需要从1到n遍历每层楼来进行状态的转移,这会极大增加算法的时间复杂度。

其实,我们可以仔细观察dp[i-1][j-1]以及dp[i][n-j]这两个表达式,当我们遍历j的时候,我们其实可以发现dp[i-1][j-1]其实是随着j的增大而增大的。这是因为随着楼层的增加,最小的操作次数必然增加了,因为需要尝试更多次才能确定边界。同理,dp[i][n-j]会随着j的增加而减少。

基于上述观察,我们其实可以发现,dp[i-1][j-1]和dp[i][n-j]其实分别单调递增和单调递减,这两者一定会有一个交点,而且这个交点就是边界条件,也就是答案。因此,我们可以使用二分法来加速算法运行,通过dp[i-1][j-1]以及dp[i][n-j]来判断二分的边界。

使用二分法优化的解法如下:

class Solution {
    int mins = -0x3f3f3f3f;
    int[][] mem;
    public int superEggDrop(int k, int n) {
        // dp[i][j]表示i个鸡蛋,j层楼,最坏的情况下最少需要扔多少次
        // dp[i][j] = min(1<=j<=n)(max(dp[i-1][j-1], dp[i][n-j]) + 1);
        mem = new int[k+1][n+1];
        for (int i=0; i<=k; i++) {
            Arrays.fill(mem[i], mins);
        }
        return dp(k, n);
    }

    public int dp(int k, int n) {
        // 只有一个鸡蛋,必然最少要扔n次
        if (k == 1) {
            return n;
        }
        // 0层楼,无论多少个鸡蛋,不用扔
        if (n == 0) {
            return 0;
        }
        if (mem[k][n] != mins) {
            return mem[k][n];
        }
        int res = 0x3f3f3f3f;
        int low = 1, high = n;
        while (low <= high) {
            int mid = low + (high - low) / 2;
            int below = dp(k-1, mid-1); // 在第j层碎了
            int above = dp(k, n - mid); // 在第j层没碎
            if (below > above) {
                high = mid - 1;
                res = Math.min(res, below + 1);
            } else {
                low = mid + 1;
                res = Math.min(res, above + 1);
            }
            
        }
        mem[k][n] = res;
        return res;
    }
}

解法二

在第一种解法中,我们定义的状态为dp[i][j],它的含义是当前有i个鸡蛋,j层楼,最坏的情况下最少需要扔多少次。其实,动态规划并不是只有一种确定的解法,随着状态定义的不同会有很多截然不同的解法。

在这里,我们可以重新来定义动态规划的状态,假设dp[i][j]表示i个鸡蛋,扔j次可以确定的最高楼层。也就是持有i个鸡蛋,允许最多扔j次,最高用来确定的楼层高度。

根据上述定义,我们可以列出动态转移方程如下:

\[dp[i][j] = dp[i][j-1] + dp[i-1][j-1] + 1 \]

其中,dp[i][j-1]表示在某层扔了一个鸡蛋但没碎,此时需要往上走,这时可以扔的次数-1,鸡蛋总数不变。结果可以表示为该层楼上的层数;dp[i-1][j-1]表示在某层扔了鸡蛋但是碎了,此时需要往下走,这时可以扔的次数-1,鸡蛋总数也-1(因为碎了一个)。结果表示为该层楼下的层数。

class Solution {
    public int superEggDrop(int k, int n) {
        // dp[i][j]表示i个鸡蛋,扔j次可以确定的楼层
        // dp[i][j] = dp[i][j-1] + dp[i-1][j-1] + 1;
        // dp[i][j-1]表示在某层扔了一个鸡蛋但没碎,此时需要往上走,这时可以扔的次数-1,鸡蛋总数不变。结果可以表示为该层楼上的层数
        // dp[i-1][j-1]表示在某层扔了鸡蛋但是碎了,此时需要往下走,这时可以扔的次数-1,鸡蛋总数也-1(因为碎了一个)。结果表示为该层楼下的层数
        int[][] dp = new int[k+1][n+1];
        int j=0;
        while(dp[k][j] < n) {
            j++;
            for (int i=1; i <= k; i++) {
                dp[i][j] = dp[i][j-1] + dp[i-1][j-1] + 1;
            }
        }
        return j;
    }
}

上述解法是一种很规范的二维动态规划的写法,这种二维动态规划通常可以进行空间优化写成一维动态规划。这里要改写成一维动态规划,关键是需要使用一个变量来记录之前的状态避免被后续的遍历所覆盖。具体的实现如下代码所示:

class Solution {
    public int superEggDrop(int k, int n) {
        // dp[i][j]表示i个鸡蛋,扔j次可以确定的楼层
        // dp[i][j] = dp[i][j-1] + dp[i-1][j-1] + 1;
        // dp[i][j-1]表示在某层扔了一个鸡蛋但没碎,此时需要往上走,这时可以扔的次数-1,鸡蛋总数不变。结果可以表示为该层楼上的层数
        // dp[i-1][j-1]表示在某层扔了鸡蛋但是碎了,此时需要往下走,这时可以扔的次数-1,鸡蛋总数也-1(因为碎了一个)。结果表示为该层楼下的层数
        int[] dp = new int[k+1];
        int j=0;
        while(dp[k] < n) {
            j++;
            int pre = 0;
            for (int i=1; i <= k; i++) {
                int temp = dp[i];
                dp[i] = dp[i] + pre + 1;
                pre = temp;
            }
        }
        return j;
    }
}

参考

http://zhuanlan.zhihu.com/p/92288604

Either Excellent or Rusty
本文转载于网络 如有侵权请联系删除

相关文章

  • 你真的懂Python命名吗?

    大家好,我是测试蔡坨坨。今天,我们来聊一下Python命名那些事儿。名为万物之始,万物始于无名,道生一,一生二,二生三,三生万物。“怎么给变量命名?”看似是一个非常基础的内容,但还是有很多人在这个部分有一点迷茫。命名常常被认为是编程中的细节问题,其重要性往往被低估。而所谓的工匠精神,往往体现在细节之处。程序员在工作中有80%的时间都在阅读和理解代码,好的命名可以提高代码的可读性和表达力,词不达意的命名则会让人摸不着头脑,增加不必要的思维开销。学好Python,从变量命名开始。合法的变量名什么是合法的变量名?所谓合法的变量名就是Python解释器能够认识的变量名。也是在编码过程中必须遵循的规则,假设不遵守规则,程序就会报错。在Python中,一个合法的变量名是由字母、下划线和数字组成,并且第一个字符不能为数字。在Python3中,对字母的定义其实是广义的,你可以写一个中文的变量名,也就是说你可以认为中文的这个字也算一种字母,但是一般来说不推荐使用中文变量名,因为有时候可能会由于一些编码的原因产生一些莫名其妙的bug。caituotuo_666="测试蔡坨坨"#√ #6

  • Appium自动化执行填的大坑分享

    自从泰斯特Club测试技术沙龙举办讲了UI自动化以后,就有很多人在问appium执行过程中断了要怎么处理?很多人都遇到这个问题,不知如何解决~对于这个问题解决方法,我是踩坑过来的,这个也是比较大的坑。待我一一说来。首先先简单了解下appium的原理,appium是一个c/s结构,我简单的形象的说,appium执行分为电脑跟手机。电脑端也是一个c/s架构,C就是自动化脚本,S就是appium服务,自动化脚本通过webdriver协议请求端口4723请求到appium服务端,appium服务端接收请求后,返回一个待sessionid会话,后续的操作都是通过这个sessonid进行操作,这是电脑端操作,电脑跟手机的交互是通过socket协议4724端口进行交互,这是appiumsever就充当客户端,而手机端就是bootstrap.jar进行操作,而boostrap.jar在下发命令给uiautomator进行操作,整体流程就是这样;既然知道了是C/S架构,所以每次在调试的时候,记得打印下整体的请求,然后要注意查看S端返回的结果,那我们说下appium执行中断服务端的提示是Couldnotp

  • 公告丨腾讯安全产品更名通知

    2020年,各行各业将继续乘着产业互联网的东风,加速数字化转型升级。为了更好地为政企客户的安全保驾护航,腾讯安全即日起更新旗下身份安全、网络安全、终端安全、应用安全、数据安全、业务安全、安全管理、安全服务等八类安全产品的命名,致力于打造全栈安全产品“货架”,让客户选购安全产品/服务更加便捷,更快地找到合适的安全产品,从而对自身的安全建设“对症下药”。腾讯安全产品全景图更名之后找不到?看这份对比索引,找到老配方。产品原来的名称产品现在的名称DDoS防护T-SecDDoS防护云防火墙T-Sec云防火墙安全治理T-Sec网络入侵防护系统哈勃样本智能分析平台T-Sec 样本智能分析平台御界高级威胁检测系统T-Sec 高级威胁检测系统云镜主机安全T-Sec 主机安全反病毒引擎T-Sec 反病毒引擎御点终端安全管理系统T-Sec 终端安全管理系统终端无边界访问控制系统T-Sec 零信任无边界访问控制系统Web应用防火墙T-SecWeb应用防火墙云枢应用级智能网关T-Sec 应用级智能网关Web漏洞扫描T-Sec 漏洞扫描服务移动应用安全T-Sec 移动应用安全手游安全T-Sec 手游安全天御借贷反

  • 测试思想 什么是软件测试(摘录)

    什么是软件测试(摘录)by:授客QQ:1033553122IEEE标准的定义:使用人工或自动的手段来运行或测定某个系统的过程,其目的在于检验;它是否满足规定的需求或是弄清预期结果与实际结果之间的差别。对软件测试还有一些不同的定义。G.J.Myers给出的定义:“程序测试是为了发现错误而执行程序的过程”。这个定义被软件测试业界所认可,并经常被引用。但实际上,这样的定义还不能完全反映软件测试的内涵,它仍局限于“程序测试”。随后,G.J.Myers进一步提出了有关程序测试的3个重要观点,那就是:(1)测试是为了证明程序有错,而不是证明程序无错误。(2)一个好的测试用例在于它能发现至今未发现的错误。(3)一个成功的测试是发现了至今未发现的错误的测试。要完整地理解软件测试,就要从不同方面和视角去辨证地审视软件测试。概括起来,软件测试就是贯穿整个软件开发生命周期、对软件产品(包括阶段性产品)进行验证和确认的活动过程,其目的是尽快尽早地发现在软件产品中存在的各种问题—与用户需求、预先的定义不一致的地方。1.软件测试的侠义观点和广义观点G.J.Myers给出了测试定义—“程序测试是为了发现错误而执行程

  • 分布式训练中数据并行远远不够,「模型并行+数据并行」才是王道

    作者:SaptadeepPal等机器之心编译参与:魔王、杜伟数据并行(DP)是应用最广的并行策略,对在多个设备上部署深度学习模型非常有用。但该方法存在缺陷,如随着训练设备数量不断增加,通信开销不断增长,模型统计效率出现损失等。来自加州大学洛杉矶分校和英伟达的研究人员探索了混合并行化方法,即结合数据并行化和模型并行化,解决DP的缺陷,实现更好的加速。在多个计算设备上部署深度学习模型是训练大规模复杂模型的一种方式,随着对训练速度和训练频率的要求越来越高,该方法的重要性不断增长。数据并行化(Dataparallelism,DP)是应用最为广泛的并行策略,但随着数据并行训练设备数量的增加,设备之间的通信开销也在增长。此外,每一个训练步中批大小规模的增加,使得模型统计效率(statisticalefficiency)出现损失,即获得期望准确率所需的训练epoch增加。这些因素会影响整体的训练时间,而且当设备数超出一定量后,利用DP获得的加速无法实现很好的扩展。除DP以外,训练加速还可以通过模型并行化(modelparallelism,MP)实现。来自加州大学洛杉矶分校和英伟达的研究人员探索了混合

  • 【leetcode刷题】T127-二叉树的后序遍历

    leetcode第145题:二叉树的后序遍历https://leetcode-cn.com/problems/binary-tree-postorder-traversal/【题目】给定一个二叉树,返回它的后序遍历。示例: 输入:[1,null,2,3] 1 \ 2 / 3 输出:[3,2,1] 进阶:递归算法很简单,你可以通过迭代算法完成吗? 复制【思路】后序遍历,递归方法和前序遍历、中序遍历类似。迭代方法,需要使用栈存储节点,并且使用visit存储访问次数。当对应的visit元素为0时,遍历左子树;为1时,遍历右子树;为2时,元素值加入结果,弹出节点。【代码】python版本#Definitionforabinarytreenode. #classTreeNode(object): #def__init__(self,x): #self.val=x #self.left=None #self.right=None classSolution(object): defpostorderTraversal(self,root): """ :typeroo

  • 自学成菜-流水账学习法lua入门

    学习背景:一直想去体验下openrestry,可惜一直没动力去完成这件事,正好工作原因需要调研,就开启体验之旅吧。开始前需要对lua语法有简单了解和认识流水式计划:基础语法简单熟悉openrestry模块知识点实践一个小项目致谢码洞公众号老钱界面排版经验传授 lua基础语法print("hellolua")复制获取数据类型函数typea=123 print(type(a))-->output:number print(type(1.23))-->output:number print(type(nil))-->output:nil print(type('123'))-->output:string print(type(true))-->output:boolean a={} print(type(a))-->output:table localb print(b)-->output:nil默认nil复制以上出现了几个关键词简单描述下: 1.local相当于声明变量b为局部变量 2.--为单行注释-

  • “搞垮” 微博服务器?每天上亿条用户推送是如何做到的

    记者|琥珀 出品|AI科技大本营(ID:rgznai100)想必国内绝大多数网民都有新浪微博的用户账号。据最新数据显示,2018年第四季度财报,微博月活跃用户突破4.62亿,连续三年增长7000万+;微博垂直领域数量扩大至60个,月阅读量过百亿领域达32个。毫无疑问,从2009年8月上线至今,微博已是当前业界领先的中文社交媒体,成绩斐然。当年有一句话叫做“围观就是力量,舆论改变中国”,明星绯闻、爆炸性新闻等众多热门事件从微博发出传遍全网。直到如今,微博也上线了不少新功能如“热搜”、“新鲜事”、“故事”等,更加强调“社交”、“全媒体”、“垂直领域”发展,进一步满足社交属性下人们对获取实时、一手新闻资源的需求。Push(消息推送)的作用则在于提高用户活跃度和粘性,提高用户留存率,进而进一步提高产品功能和用户参与度。如国内外重大事件的提醒、领域内大事件的提醒、关注人或好友的重要消息推送、感兴趣内容的消息提醒等方式,可引导用户感兴趣的内容打开应用。然而,另一个事实是,此前频频“吐槽”的应对热门事件的流量暴增导致的微博服务器崩溃问题,无论是热搜消息,还是信息流方面,均受到了极大的挑战。随着用户数

  • 查找js文件中隐藏的子域名工具 – SubDomainizer

    +前言SubDomainizer是一款用于查找隐藏在页面的内联和引用Javascript文件中子域的工具。除此之外,它还可以为我们从这些JS文件中检索到S3bucket,云端URL等等。这些对你的渗透测试可能有非常大的帮助,例如具有可读写权限的S3bucket或是子域接管等。云存储服务支持SubDomainizer可以为我们找到以下云存储服务的URL:1.AmazonAWSservices(cloudfrontandS3buckets) 2.Digitaloceanspaces 3.MicrosoftAzure 4.GoogleCloudServices 5.Dreamhost 6.RackCDN使用截图安装从git克隆SubDomainzer:git clone https://github.com/nsonaniya2010/SubDomainizer.git复制更改目录:cd SubDomainizer复制安装依赖项:sudo apt-get update sudo apt-get install python3-termcolor python3-bs4 python3-req

  • 由你定义吃鸡风格!CycleGAN,你的自定义风格转换大师

    TurningFortniteintoPUBGwithDeepLearning(CycleGAN),作者为ChintanTrivedi。 翻译|庄娴整理|MY来源|AI研习社了解CycleGAN的图像风格转换并探索其在在游戏图形模块中的应用。神经网络试图在绝地求生的视觉风格中重现堡垒之夜。 如果你是一名玩家,你一定听说过现在两场疯狂流行的大战「大逃杀」,堡垒之夜和绝地求生。他们是两个非常相似的游戏,其中有100个玩家在一个小岛上出没,直到剩下一个幸存者。我喜欢堡垒之夜的游戏玩法,但更喜欢绝地求生更逼真的视觉效果。这让我想到了,我们是否可以为游戏提供图形模块,以便我们可以选择喜欢的视觉效果,而无需依赖游戏开发人员为我们提供该选项?如果一个mod可以在绝地求生的视觉效果中呈现堡垒之夜的帧,那该怎么办?这就是我决定探索深度学习是否有所帮助的地方,并且我遇到了一种名为CycleGANs的神经网络,这种网络恰好擅长风格转换。在这篇文章中,我将介绍CycleGANs的工作方式,然后训练它们将堡垒之夜视觉转换为绝地求生。堡垒之夜(左)是卡通的视觉效果,而绝地求生(右)有更逼真的视觉效果。什么是Cyc

  • AI专家质疑深度学习,写下一篇长达27页文章

    本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处多年坚持为深度学习泼冷水的纽约大学心理学教授GaryMarcus,今天终于写了一篇长长的文章,将自己的对深度学习的看法全面、系统地阐述了一遍。在长达27页(含参考文献)的文章“深度学习的批判性评价”中,他回顾了深度学习这5年来的复兴历程,更重要的是,指出了深度学习目前面临的十大挑战。这篇论文DeepLearning:ACriticalAppraisal发布在arXiv上地址:https://arxiv.org/abs/1801.00631Marcus身兼畅销书作家、人工智能领域创业者、纽约大学心理学和神经科学教授等多重身份,还在他的公司GeometricIntelligence被Uber收购后,在Uber担任过AI实验室的负责人。他关于深度学习局限性的论述,可以追溯到2012年这波浪潮刚刚回归的时候。最近,他依然活跃,和LeCun辩论、在哈萨比斯讲AlphaZero时提出质疑,观点都很犀利。以下是该论文中关于深度学习的十大挑战部分:深度学习的局限始于我们生活中的一个反差:我们所生活的世界,数据从来都不是无限的。而

  • jQuery插件开发全解析

    jQuery插件的开发包括两种:一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法。jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级别的插件开发,即给jQuery对象添加方法。下面就两种函数的开发做详细的说明。1、类级别的插件开发类级别的插件开发最直接的理解就是给jQuery类添加类方法,可以理解为添加静态方法。典型的例子就是$.AJAX()这个函数,将函数定义于jQuery的命名空间中。关于类级别的插件开发可以采用如下几种形式进行扩展:1.1添加一个新的全局函数添加一个全局函数,我们只需如下定义:Js代码jQuery.foo=function(){alert('Thisisatest.Thisisonlyatest.');};1.2增加多个全局函数添加多个全局函数,可采用如下定义:Js代码jQuery.foo=function(){alert('Thisisatest.Thisisonlyatest.');};jQuery.bar=function(param){alert(&#

  • 【题解】旅行

    题目描述给你一张无重边无自环的带权无向图,给予起点S=1。蓝蓝本来是想让你求出S到所有其他点的最短路,可是淘淘说这个太简单了,于是他给出了加强版。给出的无向图保证S到任何点的最短路是唯一的,但是有一个限制:当从S到任意一点T时,此条最短路的第一条边不允许通过。在满足限制的条件下,求S到其它所有点最短路的长度。数据保证每个点都有解输入格式一行n,m。接下来m行,每行u,v,w三个数,表示有一条长度为w的无向边连接u和v。输出格式输出n–1行,第i行表示S到i+1的在满足限制的条件下最短路长度。输入输出样例输入#145 122 132 344 321 243复制输出#13 3 6复制说明/提示对于50\%的数据,n\le20对于70\%的数据,n\le100对于另外10\%,只有两种边权。对于100\%的数据,n\le300,m\le400分析首先在全图跑一遍dijkstra,建立一个数组a以记录从1开始到当前点s的最短路所经过的第一条边是(1,a[s]),然后我们只需要删掉这条边,在全图再针对每个点跑一遍dijkstra即可得到答案。注意题面有误,数据存在重边。#include<b

  • 2019-2020-1 20175329 《信息安全系统设计基础》第2周学习总结

    2019-2020-120175329《信息安全系统设计基础》第二周学习总结 教材学习内容总结 第二章思维导图 教材学习中的问题和解决过程 在学习过程中的代码截图如下所示 代码托管 学习进度条 代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长 目标 5000 15 400 第一周 10/10 2/2 10/10 第二周 100/100 3/3 35/35 第三周 300/300 4/4 60/60 第四周 五、参考资料 (一)信息的处理与表示 (二)信息的处理与表示 (三)信息的处理与表示 (四)信息的处理与表示 (五)《深入理解计算机系统》

  • 私有镜像迁移harbor

    1.镜像迁移第一步:开启私有仓库dockerrun-d-p5000:5000-v/opt/registry-var/auth/:/auth/-v/opt/myregistry:/var/lib/registry-e"REGISTRY_AUTH=htpasswd"-e"REGISTRY_AUTH_HTPASSWD_REALM=RegistryRealm"-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd"registry 第二步:创建脚本目录mkdir/server/scripts-pcd/server/scripts/第三步:编写脚本vimmigrate_images.sh#!/bin/sh image_names=`curl-uoldboy:123456 http://10.0.0.11:5000/v2/_catalog2>/dev/null|jq.repositories[]|tr-d'"'`foriin$image_namesdo tags=`curl-uoldboy:123456 

  • 编筐

    需要的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。 Input输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符; Output输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。 SampleInput11BA5@W SampleOutputAAAAAAAAAABBBBBBBBBAABAAAAAAABAABABBBBBABAABABAAABABAABABABABABAABABAAABABAABABBBBBABAABAAAAAAABAABBBBBBBBBAAAAAAAAAA @@@@WWW@@W@W@@WWW@@@@ #include<iostream>usingnamespacestd;charstr[100][100];intn;voidcc(intm,intth,chara){ inti; for(i=th;i<=n+1-th;i+

  • Top100Summit全球案例研究峰会第一天总结——云计算和大数据

       很荣幸受邀参加Top100Summit全球软件案例研究峰会,这次的大会主题是《技术推动商业变革》,组委会从全国投稿的460多件案例中甄选出100件具有代表价值的案例,进行为期4天的分享,第一天是开幕式,有业界的诸多牛人进行演讲,演讲分享的内容如下:-----------------------------------------------------------1.被颠覆的决策模式——大数据大价值  演讲者:张亚勤微软全球资深副总裁、微软亚太研发集团主席2.软件定义IT时代  演讲者:宋家瑜VMware大中华区总裁3.电商创造价值技术驱动未来  演讲者:蓝烨京东商城CMO4.互联网的创新思维  演讲者:谭晓生360公司副总裁5.大数据技术中国的案例分析  演讲者:苗凯翔intel中国区CTO6.对话阿里巴巴  演讲者:王坚阿里巴巴集团首席技术官7.互联网生态与大数据  演讲者:陈磊腾讯云总经理8.面向业务创新的

  • 关于 API 安全的问题

    关于API安全的问题,主要就是以下几个问题,不一定完整:一、身份鉴定。这个可以使用Oauth2.0规范,或者带有不对称密钥加密的token,选择JWT等形式,配合身份鉴定系统来保证。二、内容防篡改。可以使用数字签名算法来进行哈希校验,强制HTTPS通信。最新的系统可以考虑http/2。三、DDoS攻击。通过设置防火墙,控制API调用频率,例如协议的rate-limit等设置来进行沟通和控制。四、注入攻击。这个需要从输入校验、编解码、输入过滤和转化方面着手,主流框架都有基本的防注入设计。五、同源策略。通过正确的配置CORS来防止异常调用,但是只对浏览器有效。对于移动端可以通过分发证书或者token来验证有效的调用来源。六、中间人攻击。这个貌似没有想到太好的办法,只能在调用端提示用户处于不安全网络,有攻击风险而自行规避。等等还有其他的方法

  • 数据库

    ---title:influxDBrenderNumberedHeading:truegrammar_cjkRuby:true--- >InfluxDB是一个当下比较流行的时序数据库,InfluxDB使用Go语言编写,无需外部依赖,安装配置非常方便,适合构建大型分布式系统的监控系统。#简介InfluxDB是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。类似的数据库有Elasticsearch、Graphite等。 其主要特色功能1)基于时间序列,支持与时间有关的相关函数(如最大,最小,求和等)2)可度量性:你可以实时对大量数据进行计算3)基于事件:它支持任意的事件数据InfluxDB的主要特点1)无结构(无模式):可以是任意数量的列2)可拓展的3)支持min,max,sum,count,mean,median等一系列函数,方便统计4)原生的HTTP支持,内置HTTPAPI5)强大的类SQL语法6)自带管理界面,方便使用 influxdb安装wgethttps://dl.influxdata.com/influxdb/releases/influxdb-0.1

  • 刷题总结——飞飞侠(bzoj2143 最短路)

    题目: Description 飞飞国是一个传说中的国度,国家的居民叫做飞飞侠。飞飞国是一个N×M的矩形方阵,每个格子代表一个街区。然而飞飞国是没有交通工具的。飞飞侠完全靠地面的弹射装置来移动。每个街区都装有弹射装置。使用弹射装置是需要支付一定费用的。而且每个弹射装置都有自己的弹射能力。我们设第i行第j列的弹射装置有Aij的费用和Bij的弹射能力。并规定有相邻边的格子间距离是1。那么,任何飞飞侠都只需要在(i,j)支付Aij的费用就可以任意选择弹到距离不超过Bij的位置了。如下图    (从红色街区交费以后可以跳到周围的任意蓝色街区。)现在的问题很简单。有三个飞飞侠,分别叫做X,Y,Z。现在它们决定聚在一起玩,于是想往其中一人的位置集合。告诉你3个飞飞侠的坐标,求往哪里集合大家需要花的费用总和最低。 Input 输入的第一行包含两个整数N和M,分别表示行数和列数。接下来是2个N×M的自然数矩阵,为Aij和Bij最后一行六个数,分别代表X,Y,Z所在地的行号和列号。 Output 第一行输出一个字符X、Y或者Z。表示最优集合地点。第二行输出一个整数,表示最小

  • Oracle VM VirtualBox NAT网络ping不通

    目录 前言解决方案设置端口转发测试 其他问题(更新于2022年5月16日17:50:17)端口转发后登录慢 参考 前言 为了换了网络IP地址也一样,所以用了NAT网络,但OracleVMVirtualBox的NAT似乎与VMware的NAT模式不一样,无法连上,也ping不通。如下图所示。 解决方案 设置端口转发 解决方案就是设置端口转发。下面开始设置。在OracleVMVirtualBox主界面点击设置选择网络,点击高级。进入端口转发,设置端口转发规则。 该配置表示本机222端口映射到虚拟机22端口。映射其他端口也是同样的道理。 测试 下面我使用127.0.0.1222开始连接Linux虚拟机。使用命令如下。 sshroot@127.0.0.1-p222 复制 连接成功,如下图所示。 其他问题(更新于2022年5月16日17:50:17) 端口转发后登录慢 登录简直是龟速解决办法不要dns解析。 vim/etc/ssh/sshd_config 复制 放开注释的UseDNS并修改为no 重启ssh服务 systemctlrestartsshd.service 复制

相关推荐

推荐阅读