`

C/C++笔试题

阅读更多

1、给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列。

如:1、-2、3、5、-4、6 连续序列3、5、-4、6的和最大。
如元素全为负数,则最大的和为0,即一个也没有选。
/*
array[] 输入数组
n 数组元素个数
返回最大序列和
*/
int find_max_sum(int array[] , int n)

 

int find_max_sum(int array[] , int n)  
{  
    int i , max , sum;  
    sum = max = array[0];  
    for(i = 1 ; i < n ; ++i)  
    {  
        if(sum < 0)  
            sum = array[i];  
        else  
            sum += array[i];  
        if(sum > max)  
            max = sum;  
    }  
    if(max < 0)  
        max = 0;  
    return max;  
}  

 

2、给定一个字符串,求出其最长重复子串

例如:abcdabcd
最长重复子串是 abcd,最长重复子串可以重叠
例如:abcdabcda,这时最长重复子串是 abcda,中间的 a 是被重叠的。

直观的解法是,首先检测长度为 n - 1 的字符串情况,如果不存在重复则检测 n - 2, 一直递减下去,直到 1 。
这种方法的时间复杂度是 O(N * N * N),其中包括三部分,长度纬度、根据长度检测的字符串数目、字符串检测。

改进的方法是利用后缀数组
后缀数组是一种数据结构,对一个字符串生成相应的后缀数组后,然后再排序,排完序依次检测相邻的两个字符串的开头公共部分。
这样的时间复杂度为:生成后缀数组 O(N),排序 O(NlogN*N) 最后面的 N 是因为字符串比较也是 O(N)
依次检测相邻的两个字符串 O(N * N),总的时间复杂度是 O(N^2*logN),优于第一种方法的 O(N^3)

 

#include <iostream>  
using namespace std;  
  
#define MAXCHAR 5000 //最长处理5000个字符  
  
char c[MAXCHAR], *a[MAXCHAR];  
  
int comlen( char *p, char *q )  
{  
    int i = 0;  
    while( *p && (*p++ == *q++) )  
        ++i;  
    return i;  
}  
int pstrcmp( const void *p1, const void *p2 )  
{  
    return strcmp( *(char* const *)p1, *(char* const*)p2 );  
}  
int main(void)  
{  
    char ch;  
    int  n=0;  
    int  i, temp;  
    int  maxlen=0, maxi=0;  
    printf("Please input your string:\n");  
    n = 0;  
    while( (ch=getchar())!='\n' )  
    {  
        a[n] = &c[n];  
        c[n++] = ch;  
    }  
    c[n]='\0';     // 将数组c中的最后一个元素设为空字符,以终止所有字符串  
  
    qsort( a, n, sizeof(char*), pstrcmp );  
    for(i = 0 ; i < n-1 ; ++i )  
    {  
        temp=comlen( a[i], a[i+1] );  
        if( temp>maxlen )  
        {  
            maxlen=temp;  
            maxi=i;  
        }  
    }  
    printf("%.*s\n",maxlen, a[maxi]);  
    return 0;  
}  

 

3、字符转换成数字,数字转换成数组

 

//字符转换成数字,数字转换成字符
#include<stdio.h>
void main()
{
    int i=0,j=0,x=0,num=0,n=1234;
    char a[]={'1','2','3','4','\0'};
    while(a[i])
    {
        num=num*10+(a[i]-'0');//字符串转换为数字
        i++;
    }
    printf("%d\n",num);
    char temp[5],str[5];
    while(n)
    {
        temp[j]=n%10+'0';//数字转换为字符串
        j++;
        n/=10;
    }
    temp[j]=0;
    j=j-1;
    while(j>=0)
    {
        str[x]=temp[j];//将上面的逆序转为正序
        j--;
        x++;
    }
    str[x]=0;
    printf("%s\n",str);
}

 

4、求两个数组的交集

问题: 给你两个排序的数组,求两个数组的交集。
比如: A = 1 3 4 5 7, B = 2 3 5 8 9, 那么交集就是 3 5.
思路:
1. 每一次从B数组中取一值,然后在A数组里逐个比较,如果有相等的,则保存。该算法复杂度为 O(MN). M, N 分别为数组 A B 的长度。
2. 因为A B 都排过序,所以,每一次从B数组取值后,可以利用二分查找看是否在数组A里有B所对应的值,这样复杂度变成了O(N lg M)。 这里,如果N 比 M 大,可以从A中取值,然后在B中判断是否有A的值,这样,复杂度为 O(M lg N)。
3. 利用hashtable. 先把A中的值存在hashtable里,然后对于每一个B中的值,判断是否在A中存在,因为hashtable查找的平均复杂度为 O(1), 所以,整个算法复杂度为O(N), 但是,这里的空间复杂度为 O(M) 。但是,这种方法适合数组比较小的情况。因为如果A数组比较大,hashtable会出现collision的情况,这样,查找的平均复杂度就不再是 O(1)。

本文方法:
因为数组A B均排过序,所以,我们可以用两个“指针”分别指向两个数组的头部,如果其中一个比另一个小,移动小的那个数组的指针;如果相等,那么那个值是在交集里,保存该值,这时,同时移动两个数组的指针。一直这样操作下去,直到有一个指针已经超过数组范围。

 

public LinkedList<Integer> intersection(int[] A, int[] B) {  
    if (A == null || B == null || A.length == 0 || B.length == 0) return null;  
    LinkedList<Integer> list = new LinkedList<Integer>();  
    int pointerA = 0;  
    int pointerB = 0;  
    while (pointerA < A.length && pointerB < B.length) {  
        if (A[pointerA] < B[pointerB]) pointerA++;  
        else if (A[pointerA] > B[pointerB]) pointerB++;  
        else {  
            list.add(A[pointerA]);  
            pointerA++;  
            pointerB++;  
        }  
    }  
    return list;   
}

通过上面的算法可以得知,该算法复杂度为O(N + M).

 

分享到:
评论

相关推荐

    名企经典c/c++笔试题100道

    名企经典C/C++笔试题100道 本资源汇集了一百道来自名企的C/C++笔试题,涵盖了算法、数据结构、对象_oriented programming等方面的知识点。通过对这些题目的解析,可以帮助大家更好地理解和掌握C/C++编程语言。 1. ...

    C/C++笔试题库 (整理版)

    "C/C++笔试题库(整理版)" 本资源库收录了C/C++经典问题和面试笔试题,涵盖了基础概念、指针、数组、内存操作、字符串处理、断言等多个方面。通过本资源库,读者可以深入理解C/C++语言的精髓,掌握编程基础知识,...

    大量C/C++笔试题

    这份“大量C/C++笔试题”集合涵盖了从基础知识到深入概念的各种问题,旨在帮助求职者在面试过程中表现出色。以下是一些重要的C/C++知识点,结合题目可能会涉及到的内容进行详尽阐述。 1. **基本语法**:这是C/C++...

    比较完整的C/C++笔试题

    C/C++笔试题解析 本资源为C/C++笔试题,涵盖了C/C++语言的多方面知识点,包括函数原型、类和对象、继承、虚函数、字符串处理、内存管理等。下面将详细解析每个知识点。 一、对错题 1. 函数原型时不需要指明每个...

    中兴通讯C/C++笔试题及答案

    "中兴通讯C/C++笔试题及答案" 本资源提供了一套基础的C/C++笔试题,涵盖了C/C++的基本语法和编程技能。笔试题目涵盖了 BOOL、float、指针变量与“零值”比较的if语句、sizeof的使用、头文件中的ifndef/define/endif...

    C/C++笔试题集锦

    《C/C++笔试题集锦》是一份涵盖了广泛C/C++知识的资源,旨在帮助求职者准备相关的技术面试和笔试。这份资料不仅包含了常见的C/C++编程题目,还深入探讨了语言的一些关键概念,如类型转换和对象模型,这对于理解和...

    西门子社招软件C/C++笔试题及答案

    西门子社招软件C/C++笔试题及答案

    C/C++笔试题合集

    C/C++笔试题合集 oracle数据库培训资料 android反编译工具集合 c++课程设计聊天程序 Linux与Unix Shell编程指南(PDF) C++从入门到精通,C++Primer中文版 嵌入式linux应用程序开发详解 VB程序设计资料ppt 我...

    各大公司常见C/C++笔试题整理,含答案。

    标题中的“各大公司常见C/C++笔试题整理,含答案”指的是这是一份集合了多个知名公司在招聘过程中可能会出现的C/C++编程语言的笔试题目,这些题目通常用于测试应聘者对C/C++语言的基本理解、语法掌握以及编程能力。...

    c/c++笔试题

    C/C++笔试题是评估求职者在C和C++编程语言方面基础知识、编程能力以及问题解决技巧的重要方式。这些题目通常涵盖语法、数据结构、算法、内存管理、异常处理、预处理器、模板、STL(标准模板库)等多个方面。下面我们...

    C/C++笔试题(全)word文档 流传笔试题汇总

    【C/C++笔试题解析】 在C/C++的笔试题中,常见的问题涵盖了语言的各个方面,包括基础语法、数据结构、算法以及特定概念的理解。以下是对一些常见知识点的详细解释: 1. **位操作**: - 题目1中的`func(x)`函数...

    腾讯公司最新C/C++笔试题

    腾讯公司的C/C++笔试题主要考察应聘者在编程语言基础、数据结构、算法、操作系统以及编程实践等多个方面的知识。以下是对这些题目所涉及知识点的详细解析: 1. 宏定义Max(a, b):这个问题考察了宏定义和条件运算符...

    C/C++笔试题下载

    标题中的"C/C++笔试题下载"表明这是一些与C/C++编程语言相关的笔试题目,主要针对技术开发人员,特别是C/C++工程师的面试准备。这些题目可能涵盖基础语法、数据结构、算法、内存管理、错误排查等多个方面,旨在检验...

    C/C++经典笔试题汇总

    ### C/C++经典笔试题汇总知识点解析 #### 题目一:单向链表的反转 **知识点:** 1. **链表基础知识**:理解单向链表的基本结构(包含节点、节点间的链接关系等)。 2. **迭代反转算法**:掌握如何通过迭代方式实现...

    华为C/C++笔试题

    【华为C/C++笔试题】是针对准备华为公司招聘过程中的C和C++编程技能考核的一系列题目集合,这些题目通常涵盖了C/C++语言的基础、进阶和实战应用等多个方面,旨在评估候选人的编程能力、逻辑思维以及问题解决技巧。...

    C/C++笔试试题(word文档版,内附答案)

    C/C++笔试试题(word文档版,内附答案) 本资源提供了C/C++笔试试题的集合,其中包括微软、意法半导体等世界著名公司的笔试试题,这些试题经常出现在各类公司的笔试中。该资源对找工作的同志们有很大的帮助。 知识...

Global site tag (gtag.js) - Google Analytics