三道简单算法题(一)

简介:

好久没有做算法题了,重温几个简单的算法题。
第一题:求子数组的最大和
这是一道很常见的算法题,很多人都能很快的写出算法,但很多人都不能写得完全正确,问题主要出在sum初始化上,
很多错误的答案将他初始化为0,如果数组的所有元素都为负,那么得到的最大最是0,sum要初始化成数组的第一个元素。 

第二题:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句 
这道题在网上也有很多个版本,有在构造函数中实现加法,利用两个静态变量一个存结果,一个存当前值,然后创建一个一维n个元素的数组,存结果的静态变量即为所求,
还有的就是用两个方法,一个方法是递归的,另一个值返回常量值0,就是把递归中的判断改成了一个返回值始终是0的方法。
我要说的是第三者方法:利用模板和关键字inline,编译后的结果就是:1+2+...+n,不会生成一堆方法的调用,因为将方法定义成了inline。

第三题:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
这道题主要用上了队列的思想,先进先出,因为我们很容易实现以层的顺序将二叉树中的元素插入队列,
先将根节点插入队列,每个节点出队列的同时将其子节点加入队列。打印出队列的节点。

复制代码
//求子数组的最大和
int maxSum(int* arr,int len)
{ 
    int sum,max;
    sum=max=arr[0]; 
    for(int i=1;i<len;i++)
    { 
        if(sum<=0)
        {
            sum=arr[i];
        }else{
            sum+=arr[i];
        }
        if(sum>max)
        {
            max=sum;
        } 
    }
    return max;
}
复制代码
复制代码
//求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句
template<int n> inline int Sum(int m)
{
    return Sum<n-1>(m-1)+m;
}
 
template<> inline int Sum<1>(int m)
{
    return 1;
}

template<> inline int Sum<0>(int m)
{
    return 0;
}
复制代码
复制代码
//第三题:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
class PrintByFloor
{
    public:
       struct Node
        {
            int value;
            Node* left;
            Node* right;
            Node(int val):value(val),left(NULL),right(NULL){}
        };

       PrintByFloor():root(new Node(-1)){}
             
        
       ~PrintByFloor(){
             MakeEmpty(root);
       }

        void Print()
        {
            if(root==NULL)
            {
                return;
            }
            queue<Node*> queue;
            if(root->left!=NULL){
                queue.push(root->left);
            }else
            {
                queue.push(root->right);
            }
            while(queue.size())
            {
                Node* cur=queue.front();
                cout<<cur->value<<"\t";
                if(cur->left!=NULL)
                {
                    queue.push(cur->left);
                }
                if(cur->right!=NULL)
                {
                    queue.push(cur->right);
                }
                queue.pop();
            }
        }
  
        Node* Add(int value,Node *t)
        {
            if(t==NULL)
            {
                t=new Node(value);
            }else if(value<t->value)
            {
                if(t->left==NULL)
                {
                    t->left=new Node(value);
                }else{
                    return Add(value,t->left);
                }
            }else if(value>t->value)
            {
                if(t->right==NULL)
                {
                    t->right=new Node(value);
                }else{
                    return Add(value,t->right);
                }
            }

            return t;
        }

        Node* Add(int value)
        {
            return Add(value,root);
        }

    private :
        void MakeEmpty(Node *t)
        {
            if(t!=NULL)
            {
                MakeEmpty(t->left);
                MakeEmpty(t->right);
                delete t;
                t=NULL;
            }
        }
 
        Node *root;
     
};
复制代码

测试代码如下:

复制代码
//测试代码
int main() { 
    int arr[]={1,-3,5,5,-6,-2,-7};
    int maxValue=maxSum(arr,sizeof(arr)/sizeof(arr[0]));
    cout<<maxValue<<endl; 

    {
        PrintByFloor floor; 
        floor.Add(8);
        floor.Add(6);
        floor.Add(5);
        floor.Add(7);
        floor.Add(11);
        floor.Add(9);
        floor.Add(12);
        floor.Add(10);
        floor.Add(3);
        floor.Print();
    }
    cout<<endl;
    int sum=Sum<100>(100);
    cout<<sum<<endl;
    getchar();
    return 0;
} 
复制代码

结果截图:

 

作者:陈太汉

博客:http://www.cnblogs.com/hlxs/



本文转自啊汉博客园博客,原文链接:http://www.cnblogs.com/hlxs/archive/2012/05/08/2490034.html

目录
相关文章
|
3月前
|
存储 算法
|
人工智能 算法
算法提高:组合数学| 容斥原理常见应用
容斥原理常见的问题如下。 (1) 篮球、羽毛球、网球三种运动,至少会一种的有22人,会篮球的有15人,会羽毛球的有17人,会网球的有12人,既会篮球又会羽毛球的有11人,既会羽毛球又会网球的有7人,既会篮球又会网球的有9人,那么三种运动都会的有多少人? (2) 《西游记》《三国演义》《红楼梦》三大名著,至少读过其中一本的有20人,读过《西游记》的有10人,读过《三国演义》的有12人,读过《红楼梦》的有15人,读过《西游记》《三国演义》的有8人,读过《三国演义》《红楼梦》的有9人,读过《西游记》《红楼梦》的有7人。问三本书全都读过的有多少人?
186 0
算法提高:组合数学| 容斥原理常见应用
|
8月前
|
算法
贪心算法个人见解
贪心算法个人见解
|
算法 Java 测试技术
LeetCode 周赛上分之旅 #46 经典二分答案与质因数分解
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
73 0
LeetCode 周赛上分之旅 #46 经典二分答案与质因数分解
|
算法 JavaScript 前端开发
日拱算法:解两道“杨辉三角”题
什么是“杨辉三角”,想必大家并不陌生~~ 在「杨辉三角」中,每个数是它左上方和右上方的数的和。
|
算法 程序员
【算法集训专题攻克篇】第二十篇之二叉搜索树
【算法集训专题攻克篇】第二十篇之二叉搜索树
【算法集训专题攻克篇】第二十篇之二叉搜索树
|
算法 Python
简单算法
python 简单算法
70 0
|
算法 Java
十道简单算法题(一)
最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下,重温一下。
164 0
十道简单算法题(一)
|
存储 算法 Java
十道简单算法题(二)
最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下,重温一下。
476 0
十道简单算法题(二)