剑指offer例题分享--7

简介:   前言:继续前面的分享...  面试题31:     代码如下:  #include#includeusing namespace std;bool g_InvalidInput = false;int FindGreatestSumOfSubArray(int *data...

  前言:继续前面的分享...

  面试题31:

   

  代码如下:

  

#include<iostream>
#include<limits.h>
using namespace std;

bool g_InvalidInput = false;

int FindGreatestSumOfSubArray(int *data,int len)
{
    if(data==NULL || len<=0)
    {
        g_InvalidInput = true;
        return 0;
    }
    
    int curnum = 0;
    //整型最小值
    //int greatestnum = 0x80000000;
    int greatestnum = INT_MIN;
    for(int i=0;i<len;++i)
    {
        if(curnum <= 0)
            curnum = data[i];
        else
            curnum += data[i];

        if(curnum > greatestnum)
            greatestnum = curnum;
    }
    return greatestnum;
}

int main()
{
    int data[]={1,-2,3,10,-4,7,2,-5};
    cout << "max: " << FindGreatestSumOfSubArray(data,8) << endl;
    
    return 0;
}

  面试题37:

  

  代码如下:

  

/*************************************************************************
    > File Name: 37.cpp
    > Author: ma6174
    > Mail: ma6174@163.com 
    > Created Time: Tue 14 Aug 2018 04:41:52 PM CST
 ************************************************************************/

#include<iostream>
#include<algorithm>
#include<iterator>
#include<string>
#include<list>
#include<stdio.h>
using namespace std;

struct  ListNode
{
    int data;
    struct ListNode *next;
} ;

typedef struct ListNode  linknode_t; 
typedef struct ListNode* linklist_t;
linknode_t *CreateLink()         // 创建空的链表  返回值 链表的首地址
{    
    linknode_t *H;
    H = (linklist_t)malloc(sizeof(linknode_t)); 
    
    H->next = NULL;
    return H;
}   
void InitLink(linknode_t *H,int n)        // 初始化一个空的链表  
{
    linknode_t *r, *p;
    
    int i;
    r = H;                     //  r 指向 队尾位置 
    for(i = 0; i < n; i++)
    {
        p = (linknode_t *)malloc(sizeof(linknode_t));
        p->data = i+1;
        p->next = NULL;         // 没有下一个节点
        r->next = p;            // 将p 放在 r 的后面
        r = p;                  //  r 指向新的队尾
    }
    
}
void ShowLink(linknode_t* H)           // 从队首->队尾 打印所有节点
{
    struct ListNode *p;
    p = H->next;
        while(p != NULL){
        printf("%d --> ", p->data);
        p = p->next;   
    }
    printf("\n");
}

unsigned int GetListLength(ListNode *pHead)
{
    unsigned int len = 0;
    ListNode *pNode = pHead;
    //pNode = pNode->next;
    while(pNode->next != NULL)
    {
        ++len;
        pNode = pNode->next;
    }
    return len;
}

ListNode *FindFirstCommonNode(ListNode *pHead1,ListNode *pHead2)
{
    //得到链表长度
    unsigned int len1 = GetListLength(pHead1);
    cout << "len1: " << len1 << endl;
    unsigned int len2 = GetListLength(pHead2);
    cout << "len2: " << len2 << endl;
    
    int nLengthDif = len1 - len2;
    ListNode *pListHeadLong = pHead1;
    ListNode *pListHeadShort = pHead2;
    if(len2 > len1)
    {
        pListHeadLong = pHead1;
        pListHeadShort = pHead2;
        nLengthDif = len2 - len1;
    }

    //现在长链表走几步,再同时在两个链表上同时遍历
    for(int i=0;i<nLengthDif;++i)
        pListHeadLong = pListHeadLong->next;

    while((pListHeadLong!=NULL)&&(pListHeadShort!=NULL)&&(pListHeadLong!=pListHeadShort))
    {
        pListHeadLong = pListHeadLong->next;
        pListHeadShort = pListHeadShort->next;
    }

    //得到第一个公共节点
    ListNode *CommonNode = pListHeadLong;
    //cout << "data: " << CommonNode->data << endl;

    return CommonNode;
}

int main()
{
    linknode_t *H = CreateLink();
    InitLink(H,5);
    ShowLink(H);
    linknode_t *H1 = CreateLink();
    InitLink(H1,3);
    ShowLink(H1);
    ListNode *node = FindFirstCommonNode(H,H1);
    if(node != NULL)
        cout << "data: " << node->data << endl;
    else 
        cout << "no CommonNode!" << endl;
       
       return 0;
}

  

作者: 柳德维

-------------------------------------------

个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!

如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ⁾⁾!

目录
相关文章
|
6月前
|
算法
【动态规划专栏】动态规划:卡特兰数---不同的二叉树
【动态规划专栏】动态规划:卡特兰数---不同的二叉树
68 0
|
6月前
【每日一题Day149】LC2389和有限的最长子序列 | 贪心+前缀和+二分查找
【每日一题Day149】LC2389和有限的最长子序列 | 贪心+前缀和+二分查找
43 0
|
机器学习/深度学习
【Leetcode】面试题 08.05. 递归乘法、HJ55 挑7
目录 面试题 08.05. 递归乘法 HJ55 挑7
56 0
|
5月前
|
算法 测试技术 程序员
力扣经典150题第二十七题:两数之和 II - 输入有序数组
力扣经典150题第二十七题:两数之和 II - 输入有序数组
27 1
|
5月前
|
算法
力扣每日一题 6/16 字符串 + 随机一题 动态规划/数学
力扣每日一题 6/16 字符串 + 随机一题 动态规划/数学
43 0
|
5月前
|
算法 索引
【洛谷 P1923】【深基9.例4】求第 k 小的数 题解(快速排序)
该题目要求输入一组不超过5000000个奇数个整数,并找出其中第k小的数,不使用`nth_element`函数,而是通过实现快速排序来解决。样例输入为5个数1, 4, 3, 2, 5,k=1,输出第1小的数即最小值2。代码中定义了快速排序函数`quickSort`和划分函数`partition`,并使用`read`函数读取输入。在主函数中对数组进行排序后输出第k个元素。
48 0
|
6月前
|
人工智能 算法 索引
六六力扣刷题贪心算法之K次取反后最大化的数组和
六六力扣刷题贪心算法之K次取反后最大化的数组和
47 0
|
6月前
|
算法
六六力扣刷题数组之有序数组的平方
六六力扣刷题数组之有序数组的平方
45 0
|
算法 C++
【每日算法Day 108】一道简单的二叉树题目,写法还是挺多的。
【每日算法Day 108】一道简单的二叉树题目,写法还是挺多的。
|
算法 C++
【每日算法Day 71】面试官想考我这道位运算题,结果我给出了三种解法
【每日算法Day 71】面试官想考我这道位运算题,结果我给出了三种解法
109 0