笔试题练习(七)

简介:
1,链表的常见操作

复制代码
struct Node
{
    int value;
    struct Node* next;
}root;

//已知链表的头结点head,写一个函数把这个链表逆序
Node * ReverseList(Node *head) 
{//链表逆序
    assert(head != NULL);
    if (head->next == NULL)
    {//只有头节点
        return head;
    }
    Node* pPre = head->next;
    Node* pCur = pPre->next,pTmp;
    if (pCur == NULL)
    {//只有一个节点
        return head;
    }
    while (pCur != NULL)
    {
        pTmp = pCur->next;//记录下一个
        head->next = pCur;
        pCur->next = pPre;
        pPre = pCur;
        pCur = pTmp;
    }
    return head;
}

Node * Merge(Node *head1 , Node *head2)
{//已知两个链表head1 和head2 各自有序升序排列,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同)

    Node* head = NULL;
    Node *p1 = head1->next;
    Node *p2 = head2->next;
    Node* pCur = head;
    while (p1 != NULL && p2 != NULL)
    {
        if (p1->value < p2->value)
        {
            pCur ->next = p1;
            pCur = p1;
            p1 = p1->next;
        }
        else
        {
            pCur->next = p2;
            pCur = p2;
            p2 = p2->next;
        }
    }
    if (p1 != NULL)
    {//第一个有剩余
        pCur->next = p1;
    }
    if (p2 != NULL)
    {
        pCur->next = p2;
    }
    return head;
}
Node * MergeRecursive(Node *head1 , Node *head2)
{//已知两个链表head1 和head2 各自升序排列,请把它们合并成一个链表依然有序,这次要求用递归方法进行。
    if ( head1 == NULL )
        return head2;
    if ( head2 == NULL)
        return head1;
    Node *head = NULL;
    if ( head1->data < head2->data )
    {
        head = head1;
        head->next = MergeRecursive(head1->next,head2);
    }
    else
    {
        head = head2;
        head->next = MergeRecursive(head1,head2->next);
    }
    return head;
}
复制代码
 2,动态分配二维数组

复制代码
int **alloArrays(unsigned int nrows,unsigned int ncolumns)
{    
    unsigned int i;
    int **array = (int **)malloc(nrows * sizeof(int *));
    for(i = 0; i < nrows; i++)
        array[i] = (int *)malloc(ncolumns * sizeof(int));
    return array;
}

int** allocArrays2(int rows, int columns)
{
    int** array = new int* [rows];
    int i,j;
    for (i = 0;i< rows; ++i)
    {
        array[i] = new int[columns];
    }
    for (i = 0; i < rows; ++i)
    {
        for (j =0; j < columns;++j)
        {
            array[i][j] = i*j;
        }
    }
    return array;
}

复制代码
 

3.字符串简单操作

复制代码
/************************************************************************/
/* Author: phinecos Date:2009-06-2                                                                     */
/************************************************************************/
#include <iostream>
using namespace std;

int strcmp_p (const char *s1, const char *s2)
    int ret;
    while ((ret = *(unsigned char *) s1++ - *(unsigned char *) s2++) == 0);
    return ret;
}

int  memcmp_p(const char *s1, const char *s2, size_t n)
{  
    int ret = 0;
    while (n-- && (ret = *(unsigned char *) s1++ - *(unsigned char *) s2++) == 0);
    return ret;
}

void* memcpy_p( void *dest, const void *src, size_t count )
{
    char* pDest = static_cast<char*>(dest);
    const char* pSrc = static_cast<const char*>(src);

    if ((pDest > pSrc) && (pDest < (pSrc+count)))
    {//源地址和目标地址内存重叠
        for (size_t i = count -1 ; i != -1; --i)
            pDest[i] = pSrc[i];
    }
    else
    {
        for (size_t i = 0; i < count; ++i)
            pDest[i] = pSrc[i];
    }
    return dest;
}

int main()
{
    char str[] = "0123456789";
    char str2[] = "0";
    cout << memcmp_p(str,str2,3) << endl;
    memcpy_p( str+1, str+0, 9 );
    cout << str << endl;
    memcpy_p( str, str+5, 5 );
    cout << str << endl;
    return 0;
}
复制代码
 4,统计一个字符串中所有字符出现的次数

复制代码
#include <iostream>
#include <map>
using namespace std;

static map<char,int> countMap;
static int countArray[128];

void doCount(const char* str)
{
    while (*str)
    {
        countMap[*str++]++;
    }
}
void doCount2(const char* str)
{
    while (*str)
    {
        countArray[*str++]++;
    }
}
int main()
{
    char str[] = "fasdfdsfdferwefaasdf";
    //使用map
    doCount(str);
    map<char,int>::iterator iter;
    for (iter = countMap.begin(); iter != countMap.end(); ++iter)
    {
        cout << iter->first << " : " << iter->second << endl;
    }
    //不用map,直接数组
    doCount2(str);
    for (int i = 0; i < 128; ++i)
    {
        if (countArray[i]>0)
        {
            printf("%c\t%d\n",i,countArray[i]);
        }
    }
    return 0;
}
复制代码
 5. 在字符串中找出连续最长的数字串的长度

 

复制代码

int FindMaxIntStr(char *outputstr,char *intputstr)
{
    char *in = intputstr,*out = outputstr, *temp, *final;
    int count = 0, maxlen = 0;

    while( *in != '\0' )
    {
        if( *in >= '0' && *in <= '9' )
        {
            for(temp = in; *in >= '0'&& *in <= '9'; in++ )
                count++;
            if( maxlen < count )
            {
                maxlen = count;
                final = temp; // temp保存了当前连续最长字串的首地址,final是总的最长
                *(final+count) = '\0'; //  给字符串赋上结束符
            }
            count = 0; // 不管当前累计的最长数字是否大于前面最长的,都应该清除count,以便下次计数
        }
        //到此处时*in肯定不是数字
        in++;
    }
    // 上述比较过程只保存了最长字串在输入数组中对应的地址,避免了反复拷贝到输出数组的过程
    for(int i = 0; i < maxlen; i++)     // 将最终的最长字串保存到输出数组
    {
        *out++ = *final++;
    }
    *out = '\0';
    return maxlen;
}
复制代码
 6,最大公共子串

 

复制代码
int maxCommonStr(char *s1, char *s2, char **r1, char **r2)
{//求最大公共子串
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int maxlen = 0;
    int i,j;

    for(i = 0; i < len1; i++)
    {
        for(j = 0; j < len2; j++)
        {
            if(s1[i] == s2[j])        //找到了第一个相等的
            {
                int as = i, bs = j, count = 1; // 保存第一个相等的首地址
                while(as + 1 < len1 && bs + 1 < len2 && s1[++as] == s2[++bs])     //查找最大相等长度
                    count++;
                if(count > maxlen)  //如果大于最大长度则更新
                {
                    maxlen = count;
                    *r1 = s1 + i;
                    *r2 = s2 + j;
                }
            }
        }
    }
}



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2009/06/01/1494105.html,如需转载请自行联系原作者

目录
相关文章
|
存储 安全 关系型数据库
InnoDB引擎特性
InnoDB事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。MySQL5.5.5之后,InnoDB作为默认存储引擎,InnoDB主要特性有: InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供了一个类似Oracle的非锁定读。 InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘关系的数据库引擎所不能匹敌的。 InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池
|
设计模式 缓存 数据库连接
探索PHP中的设计模式:单例模式的实现与应用
在PHP开发中,设计模式是提高代码可复用性、可维护性和扩展性的重要工具。本文将深入探讨单例模式(Singleton Pattern)的基本概念、在PHP中的实现方式以及实际应用场景。单例模式确保一个类仅有一个实例,并提供全局访问点。通过具体代码示例和详细解释,我们将展示如何在PHP项目中有效利用单例模式来解决实际问题,提升开发效率和应用性能。
|
JSON 应用服务中间件 API
【计算机网络】Servlet API重点知识汇总
【计算机网络】Servlet API重点知识汇总
200 0
身份证号码的编排规则
作者:知乎用户链接:https://www.zhihu.com/question/19823489/answer/13074347来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
3739 0
|
开发工具
基于Gin封装Web框架 - 4. 注册路由组
基于Gin封装Web框架 - 4. 注册路由组
442 0
基于Gin封装Web框架 - 4. 注册路由组
Zookeeper之Zookeeper底层客户端架构实现原理(转载)
Zookeeper的Client直接与用户打交道,是我们使用Zookeeper的interface。了解ZK Client的结构和工作原理有利于我们合理的使用ZK,并能在使用中更早的发现问题。本文将在研究源码的技术上讲述ZK Client的工作原理及内部工作机制。
1489 0