有道难题第二题最新算法(不仅仅是速度)

最近好像算法问题又不热门了,米关系,自己喜欢就好。我的有道第二题不是双倍超立方,也不知道是什么算法,大概的题目意思,大家可以参考:“我的有道第二题(不是双倍超立方)

 

其实一开始我觉得很简单,我写的第一个解法也是正确的,不过讨厌在题目说,输入的n可以为2,000,000,000。 20亿。。。。。如果N为最大的时候,不用看了,我的解法直接out,第一时间很长,第二,直接out of Memory

 

那该怎么做呢???我寻思着它的规律,其实一直有种感觉,可一直把握不住,而且平时也没什么时间静下来,不过老留着这个问题,我一直睡不着觉,所以还是找了时间找了一下规律。我把n设为16,因为16已经足够让我们看出规律了,如果再小,这个规律也很难让我们立足。按照我第一次的解法,打印 n=16 的拼接字符串 A:


01
0110
01101010
0110101010100010
01101010101000101010001011100010

这是 n=16 时,每次循环所打印出的字符,由此我们看出,我们的循环次数为:Log2(N+1),这个不是重点,我们要找的是规律,可以看出,2的n次幂位,也就是A(2 ^ n) 一定是1,这是为什么呢?稍后说。

再来说说完全平方数:根据定义,一个数n 如果 等于 i * i 那我们就认定n为完全平方数。i<=n

按照题目,如果index 是完全平方数,则 B[index] = 1 - A[index]  ,从题目来看,其实也就是取反 0 -> 1   1->0

接着上面的来说,为什么A(2 ^ n) 一定是1呢?我们知道,每次循环的时候,A  = A + B

B是根据A的每位判断是否是完全平方数而决定的,且A的长度也是有规律的 2 ^ n 位,所以,2 ^ n 位 其实就是对A[0] 的一个判断

根据完全平方数定义, 因为 0 = 0 * 0  所以它是一个完全平方数

B[0] = 1 - A[0] = 1 - 0 = 1

这就是为什么2 ^ n 一定是1的原因了。

接下来,我们分析其他位数的规则。

其实一开始我也很迷茫,因为想到了重点,但始终捉不到它,越是如此,我越是痴迷,毕竟没学过算法,也不知道数据结构,只能慢慢的自己找寻答案,现在已经懊悔当初的年少轻狂了。

我们再看下 (2 ^ n )+ 1 位,你会发现,始终是0,按照上面的证明,我们知道,(2^n) + 1始终是对A[1]的一个判断。

1 = 1 * 1

所以 1 是完全平方数,也就是对 A[1] 的一次取反操作,而1 = 2 ^ 0  所以 A[1] = 1 所以 A[(2^n) + 1] = 0

好了,到这里大家是否已经看出点规则了呢?我稍微写一下,因为我也不是很懂,只能写个大概

A[n] = IsSqrt(A[n - 2 ^ (log2(n)]) ? 1- A[n - 2 ^ (log2(n)] : A[n - 2 ^ (log2(n)]

 

IsSqrt方法,是判断这个数是否是完全平方数,代码如下:

public bool IsSqrt(double n)
{
return Math.Sqrt(n).Equals(Math.Truncate(Math.Sqrt(n)));
}

可以看出,它是判断OldA(循环前的A)相对应位数的一个判断,那我们是不是也要进行log2(n+1)次循环吗?当然不需要,可以看出,如果是前几位的话,我们只需要循环到前几位的log2n就可以了,或许说得很朦胧,简单说下,

当n=16的时候,我们需要判断的是上一次A的第0位(16 - 2 ^ (floor(log2 16))) = 0

而0其实在每次循环中,都会是取A[0]的一个判断,所以我们只要判断 包含此位数的最小XXX (不知道怎么说)

我们只需要得到 log2(index) 次的循环就可以了。废话了这么多,我表达比较差,还是看我写的代码吧,我写了2种,意义是一样的,只不过一种用了递归,一种没有用而已。

        public int GetValues(int n)
{
if (getValue(n))
return 1;
else
return 0;
}
public bool getValue(double n)
{
double baseN = Math.Floor(Math.Log(n, 2));
double index = n - Math.Pow(2, baseN);
if (index == 0) return true;
bool isSquer = IsSqrt(index);
return isSquer ^ getValue(index);
}

 

上面是递归的做法,下面是没有递归的做法:

        public int GetValues(int n)
{
double baseN = Math.Floor(Math.Log(n, 2));
bool isSqrt = true;
double index = n - Math.Pow(2, baseN);
while (index > 0)
{
isSqrt = isSqrt ^ IsSqrt(index);
index = index - Math.Pow(2, Math.Floor(Math.Log(index, 2)));
}
return isSqrt ? 1 : 0;
}
 

两者其实是一个意思,大家可以自己理解一下我的意思吧,哈哈。

 

我知道应该还有更好的做法,比如位移,但我的能力有限,只能做到这里了,最后看下在n = 2,000,000,000 的性能吧。

 

额。。。。。不递归的情况下,竟然快了1个数量级。。。。。

 

我这个算法,真的没什么科学依据,也希望高手能指点一下,给出一个公式之类或者证明之类的,也可以给出新的好的算法。

时间: 2024-07-29 19:05:38

有道难题第二题最新算法(不仅仅是速度)的相关文章

有道难题第一题非OO解,极端记录160ms

测试平台: P8600 4G 目前看见最高效率的是夜咖啡的,我这里的数据是稳定在195-200ms上下. 然后是eaglet,基本是400ms 我这个代码稳定在170ms左右 我的这个代码主要思路 1.在原有数组外围增加一圈0,这样就降低了统计时候的复杂度 2.将一维字符串数组转换为一个字符串,其实这也是增加0的副产品,如果有朋友能维持一维字符串 数组并增加0请告知一下 3.在最后的一维数组中直接用坐标计算方式算出当前位置的相关8个下标并直接计算 4.累加后统一减384,而不是每次减'0'字符

《趣题学算法》—第1章1.1节累积计数法

第1章 计数问题 趣题学算法 1.1 累积计数法 1.2 简单的数学计算 1.3 加法原理和乘法原理 1.4 图的性质 1.5 置换与轮换 人类的智力启蒙发端于计数.原始人在狩猎过程中为计数猎获物,手指.结绳等都是曾经使用过的计数工具.今天,我们所面对.思考的问题更加复杂.庞大,计数的任务需要强大的计算机来帮助我们完成.事实上,很多计算问题本身就是计数问题. 1.1 累积计数法 这样的问题在实际中往往要通过几个步骤来解决,每个步骤都会产生部分数据,问题的目标是计算出所有步骤产生数据的总和.对这样

最新算法下如何做好网站外部优化

  继上次<新站如何应对百度最新算法>一文,笔者继续给大家带来百度算法的独家讲解第二文. 说到外部优化,很多朋友直接蹦出一个词'外链',而且是人工外链(即SEOer亲自发自己网站的外链),是的,外部优化无非都是外链上的功夫,但是人工外链有用吗?下面我们来分析一下. "外链影响权重"这条规则是谷歌原创,而且一开始对排名的影响非常大,经历某总统一恶意事件后(那时候,在谷歌搜索"最失败的人",会出现那个总统的页面,与"最失败的人"毫无关系)

一个道c++的题(用c++做,要详细代码)

问题描述 一个道c++的题(用c++做,要详细代码) 有三个海军陆战队wilyin的基地.他们的位置形成一个直角三角形.现在wilyin得到另一个海洋他想把它放在某个地方形成一个矩形与前三名海军陆战队员.他应该把它放在哪里?输入输入的第一行包含一个整数T这意味着测试用例的数量.然后T行每一行包含6个正整数x1y1x2y2 x3y3这意味着这三个海军陆战队员的位置.你可能认为不协调的绝对值超过3000人.输出对于每个案例打印出来的协调海洋在一行.输入20 0 1 0 0 10 1 0 -1 1 0

百度最新算法对新上线网站的影响

随着互联网的发展,现在个人站长也越来越多.但是个人站长的整体经验还是有待提高,上次百度绿萝算法打击了很多的个人站,对个人网站的发展限制了很多.百度绿萝算法,主要的目的就是严厉打击链接买卖的行为.随着百度对链接买卖行为的严厉打击,链接买卖行业即将消亡. 在五月份,百度针对低质量页面退出了石榴算法,这个与绿萝算法的打击目标不一样,主要针对咨询窗口,弹窗.我的一个新站即将上线,对此有一点点担忧. 那这两种新算法对即将上线的网站有没有影响呢? 百度最新算法对新上线网站的影响 新上线网站的网站要注意这些方

无名对百度K站波后最新算法大猜想

随着6.22与6.28百度k站波后,百度对算法做了很大的变化.并且逐渐生效.严重影响了一些传统SEO方式.今天无名就百度最新的算法做一些猜想.不是很全面,仅供参考.欢迎探讨.首发在SEMKEY. 论坛签名与群发逐渐失效和降权 百度最新算法实现了对论坛发帖和回帖用户的识别,百度根据一些自动群发软件与顶贴机的顶贴原理和一些万能回复搞了 一个特征库,符合这个特征的就会被认为是垃圾内容不给予权重,同一用户重复发表的同样内容的帖子或 回复不给予权重.严厉打击了论坛签名对排名的影响. Gov.Edu.购买链

解密2012年2月百度最新算法

2012年春节过后,相信不少站长都已经经历了百度算法调整带来的心跳.百度最新算法颠覆了传统SEO的操作手法,今天河北SEO-陈强锋就为大家总结一下2012年以来百度最新算法以及应对策略. 1.2012年2月开始,百度新算法对医疗类.教育类.培训类网站加大打击力度,对优化过度的判断规则开始缩紧.其中优化过度包括内链优化过度.外链优化过度.权重优化过度.百度最新算法预示着多数站因优化过度遭到批量降权,少数站幸免.百度这段时间对网站的容忍程度越来越差,它不再喜欢活泼好动的孩子,也许文静听话的乖孩子才是

经典算法题每日演练——第七题 KMP算法

原文:经典算法题每日演练--第七题 KMP算法       在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树是变态级的,那么kmp算法比红黑树还要变态,很抱歉,每次打kmp的时候,输 入法总是提示"看毛片"三个字,嘿嘿,就叫"看毛片算法"吧. 一:BF算法      如果让你写字符串的模式匹配,你可能会很快的写出朴素的bf算法,至少问题是解决了,我想大家很清楚的知

c++ primer...-C++新手,请大家为我解答第二题!非常感谢

问题描述 C++新手,请大家为我解答第二题!非常感谢 请大家给我解答一下第二题!谢谢了,还有为什么我看C++ primer plus这本书前面教的我都懂就是到练习题不会做了? 解决方案 #include <iostream>using namespace std;int main(){ cout << ""please enter long:"" << endl; double l; cin >> l; cout &l