惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
雷峰网
雷峰网
J
Java Code Geeks
G
Google Developers Blog
博客园 - 司徒正美
The GitHub Blog
The GitHub Blog
L
LangChain Blog
人人都是产品经理
人人都是产品经理
GbyAI
GbyAI
Vercel News
Vercel News
S
SegmentFault 最新的问题
Engineering at Meta
Engineering at Meta
H
Hackread – Cybersecurity News, Data Breaches, AI and More
云风的 BLOG
云风的 BLOG
F
Fortinet All Blogs
Y
Y Combinator Blog
博客园_首页
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
A
About on SuperTechFans
B
Blog
Microsoft Security Blog
Microsoft Security Blog

博客园 - Samson小天

My researches during my college life. 一些底层的简单东西。 IAT HOOK 实现进程保护 大年初一,总结一下去年的十大事件~ 解决多线程产生的“以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值” Guessing Game解题报告 (pku 2328) 分析一道08年10月12日的江苏省程序设计大赛正赛题 C# 自定义实体类或集合的自动排序 UltraRun is released 简单的QQ游戏中大家来找茬外挂编写思路 最近写C++程序时关于GetLastError的感悟。 在Vista的UAC下检查程序是否具有Admin权限及应用程序的权限切换 从程序开发角度谈类的封装性。 教你如何解决“线程间操作无效: 从不是创建控件的线程访问它” C#中调用WIN32的API 小记delegate,简单的委托介绍 一个计算简单数学表达式值的算法。 string类型的初值不是随便赋的,记一次奇怪的访问冲突事件 对C#中ADO.NET开发的理解
数学之美
Samson小天 · 2008-09-12 · via 博客园 - Samson小天

          在我的非技术博客上曾经骂过大学不该学什么《高等数学》,要是学《数学建模》,《数学分析》该多好啊。今天就看到了这两道很有趣的题目。

          1.一个大小11的数组,里面存放的是从1-10这10个数字, 其中有且仅有一个数重复了, 找出是哪个数重复了?

          2.一个无序数组里面只有一个数重复奇数次,其它数都重复偶数次, 请写个算法找出是哪个数重复了奇数次.

          看到第一道题目很快有人就想到了

           for(int i=0;i<n;i++)

          {

               for(int j=0;j<n;j++) 

               {

               }

          }

          这样的结构的确能够做出来,但是时间复杂度为O(N^2)。现在让我们优化下,我们只要调用一下简单的库函数快速排序后判断后数和前数是否相等,这样时间复杂度就优化到将近O(N*lnN+N)。但是这个还不是最优化的,我们可以让时间复杂度变成O(N+1),怎么做?

          呵呵,你可以考虑给身边读小学六年级的同学做一下,,这里没有贬低大家的意思。只是程序写了多了,看到这种题目就想到循环。其实小学生动笔就能算出来了。因为数组有11个数,只有1个数是重复的,也就是说1~10肯定在这个数组里。我们把数组的和减去1到10的和就能知道哪个数重复了。

          接下来是第二题,这道题目有点专业水平哦。我第一反应是要用位运算,也就是按位与,按位非之类的,最后其实只要把所有的数按位异或一下就能做出来了。时间复杂度为O(N)。其他的也可以用一次快速或者堆排序,然后自左向右扫描,时间复杂度为O(N*lnN+N)。

          这两道题让我感觉出了数学思想的重要性。简单的算法就可以让N^2->N,效率是平方的提升,实在是让我瞠目结舌。最后送上C++写的两到题目的“答案”

int findSame(int a[],int n)
{
 int same=0,j=0,sum=0;
 for (j=1;j<11;j++)
  sum+=j;
 for (int i=0;i<11;i++)
 {
  same+=a[i];
 }
 return same-sum;
}

int findSame2(int a[],int n)
{
 int iResult=a[0];
 for (int i=1;i<n;i++)
  iResult^=a[i];
 return iResult;
}