互联网笔试001

谈谈你对面向对象编程的认识?

面向对象编程,毫无疑问是围绕“对象”展开的。

一、计算机的一切,就像人的意识一样,是必须反映物质和物质世界的。而物质世界,具有如下特征:
1、物以类聚,鸟以群分。——类
2、人上一百,形形色(shai,三声)色,龙生九子,各有不同——继承
3、活着就是变脸,不同的场合有不同的面孔——多态性
4、知人知面不知心——封装
最后,客观世界有多复杂,面向对象编程就想要多复杂。从三大特性去阐述面想对象。  数据库1中存放着a类数据,数据库2中存放着以天为单位划分的表30张(比如table_20110909,table_20110910,table_20110911),总共是一个月的数据。表1中的a类数据中有一个字段userid来唯一判别用户身份,表2中的30张表(每张表结构相同)也有一个字段userid来唯一识别用户身份。如何判定a类数据库的多少用户在数据库2中出现过?select count(*) from 数据库1.a类数据 where exists (select 1 from 数据库2.table_20110909 where userid = 数据库1.a类数据.userid)or exists (select 1 from 数据库2.table_20110910 where userid = 数据库1.a类数据.userid)or exists (select 1 from 数据库2.table_20110911 where userid = 数据库1.a类数据.userid)数据很大的时候就要用到临时表,create temprary table tem_id(id int)insert into tem_id select id from 库2.table1insert ignore into tem_id select id from 库2.table2......insert into tem_id select id from 库2.table12select count(*) from 库1.table a inner join tem_id b on a.id=b.id这个问题我们也遇到过,我们的解决方法是:建立一张用户表,UserInMonth(userid)表里面只放不重复的用户Id,把(table_20110909,table_20110910,table_20110911)的用户Id放到一张User表里面userid都统一放到这个表里面去。判断的时候select count(*) from user u inner join UserInMonth um on u.userid=um.userid.至于数据可以用存储过程,或者一些数据仓库的用具。另外说一点,把表拆分的每日一张表,就是因为数据量比较大。。。我以前做一个GPS项目的时候,也是这么做的,每天一张表,一张表5G左右的数据。我们是把原始数据和计算过的业务数据分离的思路来实现的。。。希望对你有帮助。就是临时表实现的,把需要的数据抽取出来。然后在通过a数据的表1,和临时表进行连接,然后计算个数。 1、一个单词单词字母交换,可得另一个单词,如army->mary,成为兄弟单词。提供一个单词,在字典中找到它的兄弟。描述数据结构和查询过程。思路:判断各自素数乘积是否相等。1.定义最小的26个素数分别与字符'A'到'Z'对应。2.遍历长字符串,求得每个字符对应素数的乘积。3.遍历短字符串,判断乘积能否被短字符串中的字符对应的素数整除。4.输出结果。
#include <iostream>  
#include <string>  
#include "BigInt.h"  
using namespace std;  

// 素数数组  
int primeNumber[26] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,  
                        61, 67, 71, 73, 79, 83, 89, 97, 101};  

int main()  
{  
    string strOne = "ABCDEFGHLMNOPQRS";  
    string strTwo = "DCGSRQPOM";  

    // 这里需要用到大整数  
    CBigInt product = 1;   //大整数除法的代码,下头给出。  

    // 遍历长字符串,得到每个字符对应素数的乘积  
    for (int i = 0; i < strOne.length(); i++)  
    {  
        int index = strOne[i] - 'A';  
        product = product * primeNumber[index];  
    }  

    // 遍历短字符串  
    for (int j = 0; j < strTwo.length(); j++)  
    {  
        int index = strTwo[j] - 'A';  

        // 如果余数不为0,说明不包括短字串中的字符,跳出循环  
        if (product % primeNumber[index] != 0)  
            break;  
    }  

    // 如果积能整除短字符串中所有字符则输出"true",否则输出"false"。  
    if (strTwo.length() == j)  
        cout << "true" << endl;  
    else  
        cout << "false" << endl;  
    return 0;  
}

线程和进程区别和联系。什么是“线程安全”

进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应得并发性。进程和线程的区别在于:

一个程序至少有一个进程,一个进程至少有一个线程。

线程的划分尺度小于进程,使得多线程程序的并发性高,另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。

线程安全问题都是由全局变量及静态变量引起的。

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。

C和C++怎样分配和释放内存,区别是什么?C使用 malloc 申请,free 释放。
C++使用new申请,delete释放。
因为C++是面向对象的语言,new操作符不但会分配内存空间,还会调用对应类型的构造函数。同样的,delete的时候会调用构造函数。算法设计:一个url指向的页面里面有另一个url,最终有一个url指向之前出现过的url或空,这两种情形都定义为null。这样构成一个单链表。给两条这样单链表,判断里面是否存在同样的url。url以亿级计,资源不足以hash。

个人给出的答案非常简单,直接对比表尾项,如果表尾项相同,那么说明肯定存在同样的url,如果不相同,则不存在。

代码就略了,说下思路,分析如下:

重点是这个表式一个单链表,单链表意味着这个表不会形成环,就能找到它的尾部。而且很有意思的是,这个表是根据URL进行链接的,这会产生一个什么样的问题呢?假设当两个表的某一项指向同一个URL ‘urlA’时,它们的下一项必定指向同样的URL,直至结尾,即从'urlA'开始,两表所有项相交。那么结尾也必定相同。

反证一下:从两表结尾项向上递归,当结尾项不同时,结尾-1项也必定不同,直至递归到其中一表的表头。

数组al[0,mid-1] 和 al[mid,num-1],都分别有序。将其merge成有序数组al[0,num-1],要求空间复杂度O(1)


思路:由于要求空间复杂度为O(1),故不能使用归并排序


1、遍历0~mid -1,将其与a[mid]相比较,若 a[mid] < a[i]; 则将其交换,进入2


2、循环遍历a[mid~length],如果1中交换后a[mid] > a[mid+1] 则进行交换,进行插入排序,将a[mid]插入到正确位置

#include <iostream>

using namespace std;

void InsertSort(int a[], int index, int length){
    int temp;
    for(int i = index; i<length; i++){
        if(a[i] >= a[i+1]){
            temp=a[i];
            a[i]=a[i+1];
            a[i+1]=temp;
        }
    }
}

void  sort(int a[], int mid, int length){
    int temp;
    for(int i=0; i<=mid-1; i++){
        if(a[mid] < a[i]){
            temp  = a[i];
            a[i] = a[mid];
            a[mid] = temp;
            InsertSort(a, mid, length - 1);
        }
    }
}

int main()
{
    int a[11] ={1, 4, 6, 7, 10, 2, 3, 8, 9, 15, 16};
    sort(a,5,11);
    for(int i=0;i <11; i++)
    cout << a[i]<<"  ";
    return 0;
}

原文链接: https://www.cnblogs.com/bigchange/archive/2012/11/07/2759038.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/68529

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午1:23
下一篇 2023年2月9日 下午1:23

相关推荐