Tag: 算法

计算从1到N的整数的出现次数

您将如何有效地计算从1到N的整数十进制表示中0的出现次数? eg The number of 0’s from 1 to 105 is 16. How? 10,20,30,40,50,60,70,80,90,100,101,102,103,104,105 计算0的数量,你会发现它16。 显然,不会赞赏蛮力方法。 你必须想出一种方法,它不依赖于“有多少数字落在1到N之间”。 我们可以通过看到某种模式来做到吗? 我们不能扩展这里编译的逻辑来解决这个问题吗?

多边形的交点

给出了两个多边形。 如何确定一个多边形是在另一个多边形的内部,外部还是相交? 多边形可以是凹面或凸面。

如何使用实际订单ID生成唯一订单ID(仅显示touser)?

再次编辑:我不想再创建另一个问题,所以问这里。 我有同样的情况。 但是这次我需要C语言的算法。 有谁能够帮我。 我有下表。 CREATE TABLE IF NOT EXISTS `j741_order` ( `order_id` int(11) NOT NULL AUTO_INCREMENT, `buyer_id` int(11) NOT NULL, `subtotal` decimal(15,5) DEFAULT ‘0.00000’, `discount` decimal(15,5) NOT NULL DEFAULT ‘0.00000’, `shipping` decimal(15,5) DEFAULT ‘0.00000’, `tax` decimal(15,5) DEFAULT ‘0.00000’, `total` decimal(15,5) NOT NULL DEFAULT ‘0.00000’, `currency` char(3) DEFAULT NULL, `status` int(11) NOT NULL DEFAULT ‘0’, […]

以最有效的方式逐行读取*平台特定*

我正在寻找一种最有效的方式来阅读文本文件。 考虑到每一个可能的优点,例如: 代码将是特定于平台的Windows操作系统 以及我正在编写一个特定的当前CPU等事实’.. *不介意它不是多平台。 只是简单的性能问题 我怎么能以最快的方式编码,将文本文件的每一行读入结构? 说结构是: typdef struct _FileL{ uint lidx; char* lncontent; } FileL; 我想的是: 传递上面的FileL动态数组和文件路径,这将是填充和返回给定文件的行集合的最有效方法? getFileLines(char* fullPath, FileL** fileLines){ uint linesCount = 0;// total lines uint curLnIndex = 0;// lines counter FILE* srcFL; // will hold the source file using passed fullPath // now read file into memory //that is the […]

什么是计算2模数的大功率的最快方法

对于1 <= N <= 1000000000 ,我需要计算2 N mod 1000000007 ,它必须非常快! 我目前的做法是: ull power_of_2_mod(ull n) { ull result = 1; if (n <= 63) { result <<= n; result = result % 1000000007; } else { ull one = 1; one < 63) { result = ((result % 1000000007) * (one % 1000000007)) % 1000000007; n […]

生成C中长度为N的所有字符串

我自己尝试编码并且非常失败。 这基本上就是我想要的: a b … z aa ba … za ab bb … zz aaa baa … zzz 最后它应该生成每个字符串,使用charset az生成短于N个字符的字符串。 所以我不是在寻找排列 (在互联网上可以找到1001个实现),但是对于替换的组合 (至少在Python中它是如何调用的)。 订单并不重要 ,速度是。

用C编写的工作非递归填充算法?

我一直试图找到一个有效的填充算法。 在许多算法中,我只尝试过“递归线填充”,其中一个行为完全符合应有的主要警告,它偶尔会打击堆栈。 🙁 我已经尝试了很多我发现的非递归实现,并且它们都非常温和:要么在奇怪的地方留下空隙,要么泛滥整个区域(当它们应该被封闭时)。 任何人都有一个用C语言编写的非递归填充工作源代码(或者c ++不是太大的OOP而且我可以很容易地解开)?

用C打印字符串的所有排列

我正在学习回溯和递归,我坚持使用一种算法来打印字符串的所有排列。 我用置换算法求解了它,但是我无法理解递归方法。 我在网上搜索并找到了这段代码: void permute(char *a, int i, int n) { int j; if (i == n) printf(“%s\n”, a); else { for (j = i; j <= n; j++) { swap((a+i), (a+j)); permute(a, i+1, n); swap((a+i), (a+j)); } } } 这个算法基本上如何工作我无法理解? 我甚至试过干跑! 如何应用回溯? 它是否比贝尔算法更有效地计算排列?

格雷码递增函数

在不使用任何外部计数器或其他状态的情况下,我正在寻找一个有效的函数,该函数采用n位值(32位或左右)并返回格雷码中的后续值。 那是: int fn(int x) { int y = gray_to_binary(x); y = y + 1; return binary_to_gray(y); } 但是虽然binary_to_gray()函数是微不足道的( x ^ (x >> 1) ),但相应的gray_to_binary()根本不是那么简单( log(n)迭代的循环)。 也许有一个更有效的操作序列? 对于标准reflection格雷码,或者为了解决此问题而选择的另一格雷码。 旁白:我看到这个问题有两种可能的解决方案类型 – 一种是选择一种更容易转换为二进制的代码并使用上面给出的forms(或者为了反映代码演示更有效的二进制转换),以及另一种方法是将转换推迟到二进制并生成一种方法,该方法在不使用二进制增量的情况下遍历格雷码。 在后一种情况下,将结果代码转换为二进制代码可能会变得特别困难。 从实际角度来看,这可能是一个不利因素,但它仍然是一件有趣的事情。 更新:因为有人指出灰色解码只是log(n)操作(使用两种不同技术中的任何一种),我花了一些时间试图弄清楚这是否是对事物可以简化的严格限制。 在确定要执行的下一个操作时必须考虑所有位,否则“考虑”位将无法改变,并且函数将在两个值之间振荡。 必须以某种方式将输入压缩为可管理的比例,以确定要执行的下一个操作。 为了使其成为log(nk)操作,可以使用2k -entry LUT来缩短最后的k操作(注释表明k=32 )。 另一种可以经常减少事物的技术是乘法和位掩码的组合。 例如,计算奇偶校验以实现基于奇偶校验的算法。 从乘法和位掩码的方法来看,似乎可能有空间来发明格雷码,这进一步简化了操作集……但我不认为任何这样的代码是已知的。

权力的时间复杂度()

我实现了这个函数power() ,它接受两个参数a和b并计算一个b 。 typedef long long int LL; LL power(int a,int b) { int i = 1; LL pow = 1; for( ; i <= b ; ++i ) pow *= a; return pow; } 给定:a b落在long long int的范围内。 问题:如何降低算法的时间复杂度?