zoukankan      html  css  js  c++  java
  • 一些面试题(3)

    转载:http://gushuizerotoone.iteye.com/blog/745731

    1.stl vector list deque的区别
    http://www.iteye.com/wiki/topic/732365
    使用区别:
         1 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector ,支持[]
         2 如果你需要大量的插入和删除,而不关心随即存取,则应使用list ,不支持[]
         3 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque,deque是vector和list的结合

    2.vector的内存管理机制:
    http://blog.sina.com.cn/s/blog_625cce080100jvw3.html
    VECTOR的工作原理是系统预先分配一块CAPACITY大小的连续空间,当插入的数据超过这个空间的时候,这块空间会让某种方式扩展,但是你删除数据的时候,它却不会缩小
    vector为了防止大量分配连续内存的开销,
    保持一块默认的尺寸的内存,clear只是清数据了
    未清内存,因为vector的capacity容量未变化,系统维护一个的默认值


    1.虚函数和纯虚函数
    纯虚函数形如

    C++代码  收藏代码
    1. class parent  
    2. {  
    3. public:   
    4. virtual   void   func(...)   =   0;  
    5. };  


    只是定义一个接口没有任何实现。纯虚函数的类不能实例化,是个抽象类。子类必须去实现,否则子类还是抽象类,不能实例化

    虚函数是

    C++代码  收藏代码
    1. class parent  
    2. {  
    3. public:   
    4. virtual   void   func(...){  
    5. /*有实现*/  
    6. }  
    7. };  

    虚函数的类可以实例化。子类可以重写这个虚函数,也不可以不重写这个虚函数。 parent* p = new son(); p->func();
    重写这个函数是时,则调用的是子类的func 。

    C++代码  收藏代码
    1. class son: public parent  
    2. {  
    3. public:   
    4. virtual   void   func(...){  
    5. /*子类有实现*/  
    6. }  
    7. };  




    不重写时调用的是父类的func

    C++代码  收藏代码
    1. class son: public parent  
    2. {  
    3. public:   
    4.   
    5. };  



    虚函数是为了多态的。如果不加virtual,则不会动态去调用子类的函数了。
    构造函数不能是虚函数。析构函数可以是虚函数。


    1.内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
    避免内存泄露的方法:http://www.cppblog.com/kangnixi/archive/2010/02/15/107878.aspx
    可以将分配和释放的过程封装到一个类中,即在构造的时候申请内存,析构的时候释放内存,从而保证没有内存泄露。


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



    2.malloc和new的区别, malloc和calloc的区别
    http://liu0107613.iteye.com/blog/406954
    malloc和new的区别: 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
    malloc和calloc的区别:函数malloc()和函数calloc() 的主要区别是前者不能初始化所分配的内存空间,而后者能。如果由malloc()函数分配的内存空间原来没有被使用过,则其中的每一位可能都是0;反之, 如果这部分内存曾经被分配过,则其中可能遗留有各种各样的数据。也就是说,使用malloc()函数的程序开始时(内存空间还没有被重新分配)能正常进行,但经过一段时间(内存空间还已经被重新分配)可能会出现问题。
    函数calloc() 会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那麽这些元素将保证会被初始化为0;如果你是为指针类型的元素分配内存,那麽这些元素通常会被初始化为空指针;如果你为实型数据分配内存,则这些元素会被初始化为浮点型的零。


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



    3.读取一个文本的十行,排序


    sed -n '200,600p' a.txt >> b.txt //读200到600行


    sort


    文件veglist与文件fruitlist的文本行经过合并与排序后被保存到文件clist中。
    $ cat veglist fruitlist | sort > clist
    .

    显示文件example中不重复的行。   uniq - u example


    1.如果你只想看文件的前5行,可以使用head命令,
    如: head -5 /etc/passwd


    2.如果你想查看文件的后10行,可以使用tail命令,
    如: tail -10 /etc/passwd


    3.你知道怎么查看文件中间一段吗?你可以使用sed命令
    如: sed -n '5,10p' /etc/passwd 这样你就可以只查看文件的第5行到第10行


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

    微软趣味题:http://www.iteye.com/topic/513336

    ----------------------------------------
    1. 设计一个容器,主要支持3个操作

    1:插入一个整数

    2:删除一个整数

    3:随机返回容器内的一个整数,每个整数被返回的概率均等

    可以假设插入时整数都不重复,删除时容器内一定有你想删除的那个整数。同时系统提
    供一个完全随机的复杂度为O(1)的随机函数。

    需要上述3个操作都是O(1),怎么设计?

    用hash表和数组的结合。定义一个array储存整数,这样第三个需求可以在O(1)完成,另定义一个hash表储存数字和
    其在array中的位置,增加时,在array末尾增加整数并将位置加入hash表,删除时,从
    hash表查到位置,然后再array中将最后一个数字调整到需要删除的位置,并修改最后一个
    数字在hash表中的位置信息
    -------------------------
    倒排索引的结构是怎样的。看那个倒排表http://forfuture1978.iteye.com/blog/546771

    key是单词和这个单词的df,value是这个单词出现的doc的id和在这个doc出现的频率tf

    -------------------------------
    Lucene的典型操作

    Java代码  收藏代码
    1. Directory fsDirectory = FSDirectory.getDirectory(indexDir, true);  
    2. Analyzer analyzer = new StandardAnalyzer()  
    3. IndexWriter indexWriter = new IndexWriter(fsDirectory, analyzer, true);//true的意思是重写索引文件  
    4.   
    5. Document document = new Document;  
    6. document.add(new Field("title", title, Field.Store.Yes, Field.Index.TOKENIZED))  
    7. indexWriter.addDocument(document);//生成索引  
    8.   
    9. QueryParser queryParser = new QueryParser("content", analyzer);  
    10. Query = queryParser.parse(searchWord);  
    11. IndexSearcher indexSearch = new IndexSearcher(indexDir);//指定目录  
    12. Hit hits = indexSearcher.search(query);  



    ----------------------------------
    多线程sleep()和wait()和join().
    http://reeboo.iteye.com/blog/548104
    多线程的转换图见附件。sleep进入到block pool
    t.sleep(1000):线程t睡眠1000,进入到block pool,不会释放同步锁,睡完可以runnable

    当调用了某个对象的wait()方法时,当前运行的线程就会转入等待状态(WAITING),等待别的线程再次调用这个对象的notify()或者notifyAll()方法(这两个方法也是本地方法)唤醒它,或者到了指定的最大等待时间,线程自动醒来。如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。

    join:在a线程中执行b线程的b.join()方法,是a线程要等到b线程执行完,再执行a

    Thread.yield()。让线程调度器将CPU从一个线程转移到另一个线程

    线程的状态:
    NEW,在start()调用之前
    RUNNABLE,处于RUNNABLE状态的线程在JAVA虚拟机(JVM)上是运行着的,但是它可能还正在等待操作系统分配给它相应的运行资源以得以运行----cpu--> running。
    BLOCKED,当前线程调用了ThreadObject.sleep()
    WAITING,当前线程调用了java.lang.Object.wait()、 java.lang.Thread.join()
    TIMED_WAITING,定时等待,当前线程调用了 java.lang.Object.wait(long
    timeout)、java.lang.Thread.join(long millis)
    TERMINATED;线程执行完run()方法
    ----------------------------------------
    网页爬虫的问题:比如调度算法、去重、更新策略、分布式存储
    http://yangzhao.iteye.com/blog/442375
    http://yangzhao.iteye.com/blog/442390

    如何识别网页中的重要信息:真正的网络爬虫,是需要比较智能识别到各种网页当中最重要部分,那就是网页正文,识别时间也是不可少一部分。目前,我是TABLE标签或者DIV标签去识别各个网页当中最重要部分。如果是采集新闻信息,那就更好办了。一般情况下,逗号加句号等于或大于10,那么就是你想要得新闻信息。如果不是新闻类型,就是当要网页当中最重要得部分,还需要加一点工作量。就是怎么去掉噪音的问题。噪音一般是table或div内容长度 /a标签所包含内容长度>3 (个人经验zz)

    网页的更新策略?http://www.iteye.com/topic/350840#933181
    这个可以设定网页的更新权重。比方说行业里面排名靠前的权重大,更新快。否则权重小,更新慢。然后就是,在原始权限的基础上,每次爬下来的内容,和之前的内容作一次对比(把上次的内容取MD5比较)。如果相同,权限就降低一个等级。总是,算法很多,这个不固定。

    -------------------------------------------
    NIO(new io)与IO
    http://wj-126mail.iteye.com/blog/717621里面有说为什么NIO比IO快
    原来的I/O库与NIO最重要的区别是数据打包和传输的方式的不同,原来的 I/O 以流 的方式处理数据,而 NIO 以块 的方式处理数据。但NIO还不是异步IO?

    一个NIO和socket编程/多线程编程的例子http://aga.iteye.com/blog/206691

    NIO学习系列:http://zhangshixi.iteye.com/

    ---------------------------------------------
    1.栈和堆得区别:
    http://swingtux.iteye.com/blog/644739
    栈:由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。速度比堆快,但程序员是无法控制的。
    堆:一般由程序员分配释放 如malloc,速度比较慢,而且容易产生内存碎片

    ----------------------------------------------
    2.C++:析构函数写成虚函数是干什么用的,为什么要这么写?

    写成虚的是为了在实现多态的时候不造成内存泄露,

    如果基类析构函数前不加vitual,派生类对象被销毁后,只会调用基类的析构函数,而不会去调用派生类的析构函数。
    ----------------------------------------------
    3.写一个宏,求两个数中较大数的一个数
    #define MAX(X,Y) ((X)>(Y)?(X):(Y)) 注意括号
    ----------------------------------------------
    4.Raid:http://www.iteye.com/topic/543390
    ----------------------------------------------
    5.sql教程: http://www.w3school.com.cn/sql/sql_top.asp

    Sql代码
    1. SELECT DISTINCT USERID    
    2.   FROM (SELECT T2.TOUSERID AS USERID, T2.SENDTIME    
    3.           FROM USER T1, MESSAGE T2    
    4.          WHERE T1.USERNAME = 'TestUser'    
    5.            AND T1.USERID = T2.FROMUSERID    
    6.          ORDER BY SENDTIME DESC    
    7.         UNION ALL    
    8.         SELECT T2.FROMUSERID AS USERID, T2.SENDTIME    
    9.           FROM USER T1, MESSAGE T2    
    10.          WHERE T1.USERNAME = 'TestUser'    
    11.            AND T1.USERID = T2.TOUSERID    
    12.          ORDER BY SENDTIME DESC)    
    13.  WHERE ROWNUM <= 10    
    14.  ORDER BY SENDTIME DESC;   
  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/buptLizer/p/2165302.html
Copyright © 2011-2022 走看看