首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

算法考试填数字问题

在算法考试中的最后一题,题目为:对于任意一个数字n,我们有一个长度为2n的数组,我们需要把1~n个数填入这个数组里2次。...填入数字的规则如下:当填入数字n时,另一个n必须与当前的n距离为n,例如两个1之间要夹着一个数字,两个2之间要夹着两个数字,如此类推,直到把2n个空格填满。...现在我们要设计一个算法,我们求出n个数字的所有排列方式。...我的算法思想如下:既然两个n之间的距离为n,我们应该从n开始填入,因为n可以填入的位置最少,为1~n-1,而当n填入数组之后,n-1可以选择填入的位置的个数也为n-1,如此类推,1可以填入的位置的个数也为...n,begin为允许开始填入的位置 void input(int n){ if(n==0) return; for(int i=0;i<size-n-1;i++){ init(array,n); if

78720

leetcode 37. 解数独----回溯篇1

---- 解数独题解集合 回溯法 位运算 ---- 回溯法 这题和八皇后有点相似,不同的是八皇后每行只放一个就可以到下一行继续尝试,而这道题每行都放完没有冲突之后才能到下一行继续尝试,所以判断的逻辑稍微比八皇后多一点...直到递归到最后一个格子,board 填满了,结束递归。 为什么要回溯 每填一个空白格都是尝试,选填一个数,如果没有冲突就填上去,是一种试探。...<='9'; i++) { //如果当前位置填入当前数字i,不满足条件,就换下一个数字试探 if (!...//如果选择了当前数字后,从当前行下一列开始填到结尾,每一个位置都能找到符合的数字,那么返回真 //虽然当前数字可以填在当前位置,但是会影响后面数字的选择情况,可以这个位置填入数字后,后面位置无论怎么调试都无法填完...0; } //如果当前位置九个数字都不满足填入当前位置的条件,说明之前的选择存在问题,需要返回上一层重新选择上一层的数字 //因为这里数独有且仅有一个解 return false;

38630
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Q1663 具有给定数值的最小字符串(Smallest String With A Given Numeric Value)

    读完描述可将本题精简为如下内容: 给两个整数 n 和 k,返回序列长度为 n 且数字和等于 k 的一个数字序列(每个数字的范围为 1-26,对应 26 个字母),要求小的数字尽量放前面.   ...如数字和<k 说明无法满足,s=s+1 重复第一步 如数字和>=k 说明能否满足,i=i+1,s=s+1,重复第一步 直到所有的数字填入 java 代码见:点击这里,translateNum1 方法...当然可以,我们并不需要每次+1 后再判断能否满足需求,一次计算即可计算出当前位置最小能填入多少,流程如下:设定 i=1,sum=0 假设 i 以后的位置全填入 26,计算出还缺多少才能补足到 k. temp...=(26*(n-i))-(k-sum) 如果 temp>=0 说明后面全填 26 肯定能满足要求,因此当前位置填入最小值 1,i=i+1,sum=sum+1,重复 1 如果 temp<0 说明即使后面全为...0 也不能满足要求,需要在 i 填入-temp 的值才行,i=i+1,sum=sum+(-temp),重复 1 java 代码见:点击这里,translateNum 方法 本文解法是将尽量小的数字填到前面

    28730

    JavaScript实现十大排序算法

    通过选定一个数字作为比较值,将要排序其他数字,分为 >比较值 和 <比较值,两个部分。并不断重复这个步骤,直到只剩要排序的数字只有本身,则排序完成。...效果图 解法 注意点 插入排序时,并不是一个分组内的数字一次性用插入排序完成,而是每个分组交叉进行。...// 当下标大的数字,小于 下标小的数字,进行交互 // 这里注意,分组内的数字,并不是一次性比较完,需要i逐步递增,囊括下个分组内数字 while(j - gap >= 0 &&...,空出位置 while(j - gap >= 0 && x < arr[j-gap]){ arr[j] = arr[j - gap]; // 将符合条件的数字填入空出的位置 j...= j - gap; } arr[j] = x; // 最后,将缓存的数字填入空出的位置 } } return arr; } 复制代码

    23130

    SQL 打印矩阵(二)

    完整的规则: 有一张 5 x 5 的表格,我们要往这张表格中填充 1~25 的数字; 如果是奇数行,则从左到右填充数字;如果是偶数行,就需要按从右到左的顺序填入数字。...先从表格的左上角(即第一行第一列)填入数字 “1”,在第一行第二列填入“2”,直到把第一行填满; 当上一行填满的时候,就开始往下一行填数据。...比如,第二行要从右往左依次填入“6”、“7”、“8”、“9”、“10”。 循环反复,直到所有空格都填满数字。 接下来,我们将实现这个需求。 第一步,生成 1~25 的数。...x0 AS (SELECT num, CEIL(num / 5) AS group_no FROM t_seq) SELECT * FROM x0 第三步,动态排序。...FROM x0 ORDER BY group_no, ordered) SELECT * FROM x1 注意,我们在 SQL 中加入了一个新字段 seq,seq 存储的是 1~25

    65230

    谈一谈|递归解析之DFS全排列

    前言 通过上一篇文章《return None来看递归函数流程解析》了解了递归函数的调用及执行之后,来看看如何应用吧。...先选择一条路一直走下去,当走不通了,就回到上一个路口,看看还有没有其他可以走,有就继续往下走,没有就再倒退一个路口,直到走出迷宫或者走完所有路线。...执行步骤2 清空当前格子(后退一格),执行步骤3 查看有没有其他没用过的数字可以填充下一个空白格子,没有就再次执行步骤2,如图二中的b、c。有就填充,并再次执行步骤3.直到格子填满,如图二中的d、c。...由于选择一个数字后,后面不可再选,如temp第一个格子填1,后面三个格子便不能再填1,所以需要有visit记录哪些元素可以使用,True表示可以使用,Flase表示已经使用过,不能再使用。 ?...图四 DFS全排列代码执行示意图 1)执行dfs(0),注意函数中的第一层for循环,表示对于temp[0],会分别填入1、2、3、4。

    2.1K20

    C++离散与组合数学之如何让错排列一步错,步步错!

    数字4和1 2 3的一个错排数3 1 2中的每一个数字交换位置。如下图其有3种情况。 数字4和1 2 3的一个错排数2 3 1中的每一个数字交换位置。 统计可知,1 2 3 4四个数字共有9种错排列。...如下图所示,把1 2 3 4 填入4个单元格,对于任一单元格中数字要求有2点: 不能是已经被使用过的数字。 和位置编号相同的数字不能填入。...如下图,在向第一个单元格中填数字时,数字1不能填入,只能在2、3、4中选择其中的一个填入。...在向第二个单元格填数字时,如果数字3已经填入在第一个单元格,则不能再填入第二个单元格,因数字2与单元格的位置编号相同,也不能填入,除此之外的1、4s可填入。...再把第三个位置的数字与后面的位置中的数字交换。以此类推,直到所有位置交换。如下图所示: 依照上述的原则,再在新生成的子状态(即错排列)的基础上重新转换出更多的子状态。

    13310

    程序员进阶之算法练习(三十七)Codeforces

    比如说当我们往6的左边填入一个数字时,因为6相对1已经是距离最大值,而向左填入会导致y坐标减1,那么填入数字只能比6更小。...3 0 2 0 3 0 1 那么这里的交换其实就是: [3,0,1,2,3] 原始是[3,0,1],第一次操作后是[0,1,2],第二次操作之后是[1,2,3],满足要求; 3 0 2 0...1 0 3 [1,0,3,0,1,2,3] 是第二样例; 总结前面的思路,就是不断拿0去交换b里面的数字直到a里面的数字可以开始填1、2、3...; 现在的问题是如何断定1开始填是可以的?...容易知道如果从第x个位置开始填入有解,那么从第x+1个位置开始填也是有解。 那么可以从[1, n]二分,最终得到一个有效的解。 这里需要考虑一种特殊情况,就是填充的数字不是从1开始的。...0,延后1的插入位置,那么2、3、4、、等所有的位置都会延后; 直到所有的数字插入完毕。

    66830

    Leetcode No.47 全排列 II(DFS)

    一、题目描述 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。...我们定义递归函数 backtrack(idx, perm) 表示当前排列为 perm,下一个填入的位置是第idx 个位置(下标从 0 开始)。...要解决重复问题,我们只要设定一个规则,保证在填第idx 个数的时候重复数字只会被填入一次即可。...而在本题解中,我们选择对原数组排序,保证相同的数字都相邻,然后每次填入的数一定是这个数所在重复数集合中「从左往右第一个未被填过的数字」,即如下的判断条件: if (i > 0 && nums[i] ==...假设我们有 3 个重复数排完序后相邻,那么我们一定保证每次都是拿从左往右第一个未被填过的数字,即整个数组的状态其实是保证了 [未填入,未填入,未填入] 到 [填入,未填入,未填入],再到 [填入填入

    45320

    归并排序的迭代(非递归)实现

    归并排序先将数组进行分割,直到每个子数组只有一个元素,这样就可以将相邻的两个子数组看成是两个已排序的数组,构成Merge算法的先决条件,就可以用Merge算法进行排序,构成一个长度翻倍的子数组。...可以看到,每次程序都将数字两两分组(n/2个组),组内单独排序,最后将这些组两两合并,生成n/4个组,组内再单独排序。直到最后只剩下一个组为止。 2路归并排序的时间复杂度为O(logN)。...,然后将另一个数组的剩余部分放入临时数组,构成一个长度与原数组相同,且已排序的数组 //某一数组全部填入临时数组之后,将另一个数组的余下部分填入临时数组 if(s !...B[i] = A[low + s]; s ++; } i ++; } //某一数组全部填入临时数组之后...,将另一个数组的余下部分填入临时数组 if(s !

    1.5K30

    一文带你读懂排序算法(四):归并算法

    归并排序的基本思想核心是分治,就是把一个复杂的问题分成两个或多个相同或相似的子问题,然后把子问题分成更小的子问题,直到子问题可以简单的直接求解,最原问题的解就是子问题解的合并。...算法思想 归并排序的主要思想是分治法,排序的方法就是按照大小顺序合并两个元素,接着依次按照递归的返回顺序,不断地合并排好序的子数组,直到最后把整个数组的顺序排好。...直到所有部分的元素个数都为1 从最底层开始逐步合并两个排好序的数列 算法图解 举个例子,数组:[10,80,70,30,40] 分解 分解1 分解2 分解3 归并 归并1 归并2 归并3...n 的额外数组,合并完成之后,这个数组的空间就会被释放,所以算法的空间复杂度就是 O(n)。...如果没有空间上的限制,归并排序是一个不错的选择。100万的随机数字,归并排序大约耗时150毫秒。

    32320

    再看一次吧,保证你学会归并排序

    当尝试着将分而治之的思想应用在排序上之后,人们惊人地发现算法的复杂度相比于从前有了一个质的提升。这种使用分治归并思想创建的算法,被称为归并排序(merge sort)。...我们举个例子: a = [1, 4, 6] b = [2, 4, 5] c = [] 我们用i和j分别表示a和b两个数组的下标,c表示归并之后的数组,显然一开始的时候i, j = 0, 0。...填入一个之后: i = 1 j = 0 a = [1, 4, 6] b = [2, 4, 5] c = [1] 填入两个数之后: i = 1 j = 1 a = [1, 4, 6] b = [2,...4, 5] c = [1, 2] 我们重复以上步骤,直到a和b数组当中所有的数都填入c数组为止,我们可以很方便地写出以上操作的代码: void merge(vector& a, vector...表面上看的确如此,但数组有序性这个概念里面有一个bug,就是当数组当中只有一个元素的时候,它就是天然有序的。 所以我们可以将数组一直往下拆分,直到数组当中只有一个元素为止。

    39630

    Day6 不要二、把字符串转换成整数

    W * H 的二维数组,然后判断能否填入蛋糕(上下左右都不能有蛋糕),最后再返回成功填入的蛋糕数即可 #include #include using namespace...; i++) { for (int j = 0; j < y; j++) { //填入蛋糕:距离为2的格子处没蛋糕或者越界,可正确填入...,所以在进行转换时需要特别注意 非法的情况: 出现多个 +、- 号 在数字字符串为空时,出现了非数字字符,比如 a 出现符号 +、- 的情况下,仍然出现非数字字符 出现前导0之后,仍然出现 +、- 其他情况...,需要去除符号的负面影响 //其实就是相当于数字字符串之后出现了非数字字符 flag = false;...break; //数字字符串之后出现了非数字字符 } } //2、进行转换 //首先排除长度越界情况

    13610

    逻辑电路&代数运算(下)

    格雷码的发明即是用来将误差之可能性缩减至最小,编码的方式定义为每个邻近数字都只相差一个位元,因此也称为最小差异码,可以使装置做数字步进时只更动最少的位元数以提高稳定性。...镜射排列: 函数卡诺图最小项(Σm):把函数包含的所有最小项,以“1”填入变量卡诺图对应编号的小格内。最大项(ΠM):把函数包含的所有最大项,以“0填入变量卡诺图对应编号的小格内。...每一个圈写一个最简与项,规则是,取值为l的变量用原变量表示,取值为0的变量用反变量表示,将这些变量相与。然后将所有与项进行逻辑加,即得最简与—或表达式。...F=AB+AC+B'C'+A'B' F=11x+1x1+x00+00x x分别代入0和1,填入。...卡诺圈先找8个连续的1,然后找4个连续的1,然后找2个,直到所有的1都被圈起来。如果一个变量既出现了0又出现了1,就把它消掉。如果出现了0,就写它的反变量。如果出现了1,就写它的原变量。

    6.3K31

    程序员进阶之算法练习(五十八)

    、n-1种可能; 那么累计这个数字和sum,直到数字sum大于k,此时找到b的第1个位置; 接下来用sum和k的差值,就可以计算第2个b的位置,剩下的字符就全部是a了; int main(int argc...字符,分别填入a/b/c字符中的一个; 输入: 第一行 ,表示样例数 (1≤≤1000) 每个样例一行,字符串 包括 'a', 'b', 'c' 和 '?'四种字符,字符串长度不超过10e5。...连续,则只需考虑相邻的字符,填入一个不冲突的字符填入即可; 如果有多个?连续,因为连续?的相邻字符最多只有两种,但是?可以填入三种字符,则?...必然可以填入一个字符,使得三个字符不连续相同; 那么,什么情况下会出现-1的情况? 幸好题目给出了样例:原来的字符就有相同字符的情况。...} 题目4 题目链接 题目大意: 给出1~n的n个整数组成的数组,每个数字都只有一个; 我们把数字i称为beautiful,如果能够在数组中找到一段连续的数字,这个区间内的数字是1到i; 比如说对于数组

    47320

    【算法与数据结构】奇数阶魔方阵

    奇数阶魔方阵的数字规律 通过对奇数阶魔方阵的分析,其中的数字排列有如下的规律: (1)自然数1出现在第一行的正中间; (2)若填入数字在第一行(不在第n列),则下一个数字在第n行(最后一行)且列数加...1(列数右移一列); (3)若填入数字在该行的最右侧,则下一个数字就填在上一行的最左侧; (4)一般地,下一个数字在前一个数字的右上方(行数少1,列数加1); (5)若应填的地方已经有数字或在方阵之外...,则下一个数字就填在前一个数字的下方。...j; for(i=2;i<=row*row;i++){ //若填入数字在第一行且不在最后n列,则下一个数字在第n行且列数加1 if(rowindex==0&&colindex...continue; } //若应填入的地方已经有数字或者在方阵之处,则下一个数字就填在前一个数字的 //一个数字的下方

    21320

    LeetCode动画 | 37.解数独

    一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 空白格用 '.' 表示。...因为一个数独只有1~9的数字。 回到题目描述,一个数独的解法需要遵循以下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。...= '.') { if (++j >= 9) { i++; j = 0; } if (i >= 9) return true; // 到这里说明数独已填入数字是有解的...// 不能返回为空,返回为空会破坏掉已填入数字 } 第二个是在空格上选择路径,从待选择列表选择一个路径,但需要将待选择列表排除掉当前不满足规则的数字...true; // 到这里说明数独已填入数字是有解的 } for (int index = 0; index < 9; index++) { // 宫格索引

    52420

    第六章:FTP详细介绍+winServer2008搭建ftp服务器+winServer2008开启端口

    server-u服务器,但是我们的server-u是收费软件,如果公司对软件版权问题比较注重的话,不建议使用server-u,特别是如果公司有安装了server2008的话,我们就可以使用server2008及之后它的版本的...2、创建用户组         server 2008对用户组和用户的管理比较严格,而且我们作为一个ftp服务器,肯定涉及到非常多的用户,单独使用用户来管理工作量非常大而且不显示,所以这里我们首先创建一个用户组...点击之后会在名称之前加上本机的名称,确定。                 ...1、公认端口(Well Known Ports):从0到1023         2、注册端口(Registered Ports):从1024到49151         3、动态和/或私有端口...-> 完成  端口相关 1、命令 netstat -na ,会显示本机连接情况及打开的端口 2、telnet ip port 命令测试端口是否开放 3、安装telnet

    40820
    领券