程序员编程艺术第一~二十二章集锦与总结(教你如何编程)

2021-07-07 c++作业。 去除首尾号 【问题描述】假定输入的字符串中只包含字母和号。编写函数,删除首部和尾部的*号。 【输入形式】含*的字符串 【输出形式】去除首部和尾部*后的字符串 【样例输入】 helloworld***** 【样例输出】hello****world #include <iostream> using namespace std; #include <string.h> void trim(char *str) { int begin=0,end,i=0; while(. 阅读详情

文章转载:http://blog.csdn.net/v_july_v/article/details/7004661

 程序员编程艺术第一~二十二章集锦与总结(教你如何编程)

 

作者:July、编程艺术室。
出处:http://blog.csdn.net/v_JULY_v 

题记   

    好久没更新博客了,虽只有一个月,但对我来说,已是长久。最重要的是11月初来北京后,在这近一个月找工作的过程中,面试、拜访、购书、读书,亦许久没有敲代码了,手异常生疏,虽只有一个月,但对我来说,仍已是长久。为了表示我一直在关注着本博客,从未曾离开,也为了可以更多的思考,更为了让手不致生疏,更新吧。

    ok,针对微软100题一题一题解答的,程序员编程艺术已经写到第二十二章了(艺术这个高帽子早已有意摘取之,然都戴了这么久了,还是戴着好了),其中有些题目的解答甚是值得商榷,再者,把这些文章和题目的大致摘要、详情列出来,也方便读者阅读,回顾,适应读者所需亦能方便你我更好的思考。

    前十章的总结见这:程序员编程艺术第一~十章集锦与总结。下面,把已经写过的编程艺术的前二十二章总结下,这几十道题目的解答若是有任何漏洞、疏漏以致错误,读者如经发觉之,还望不吝赐教或予以批评指正,本人感激不尽,谢谢。

无私分享,造福天下

程序员编程艺术第一~二十二章,下面,是各章的大致摘要,详情还请打开链接参看原文:

    原题为:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef左旋转2位得到字符串cdefab。
请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。

    原文中,给出了以下几种思路:

  1. 拿abcdef 这个例子来说:
    1、首先分为俩部分,X:abc,Y:def;
    2、X->X^T,abc->cba, Y->Y^T,def->fed。
    3、(X^TY^T)^T=YX,cbafed->defabc,即整个翻转。
  2. 两指针一前一后,逐步翻转;
  3. 通过递归转换,缩小问题之规模;
  4. stl::rotate 算法;

     在经过这道左旋转字符串题目的搜索,发现,搜索引擎的第一个选项竟大部是链接自转载本文文章的其它网站,不指原创、原版,反指转载、盗版,所以,接下来,不再给出搜索结果的示意图了。

 

    原题为:假设这有一个各种字母组成的字符串,假设这还有另外一个字符串,而且这个字符串里的字母数相对少一些。从算法是讲,什么方法能最快的查出所有小字符串里的字母在大字符串里都有?

比如,如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPOM
答案是true,所有在string2里的字母string1也都有。
  
如果是下面两个字符串:  
String 1: ABCDEFGHLMNOPQRS   
String 2: DCGSRQPOZ  
答案是false,因为第二个字符串里的Z字母不在第一个字符串里。

 

    原题为:5.查找最小的k个元素
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。

 

    原题为:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。
    假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。

 

     “ok,狂想曲第三章提出了一个算法,就是快速选择SELECT算法,关于这个SELECT算法通过选取数组中中位数的中位数作为枢纽元能保证在最坏情况下,亦能做到线性O(N)的时间复杂度的证明,在狂想曲第三章也已经给出。”

 

伴随数组

原第一次排序后:

      a [i].data  1 2 3 4 5 6 7
      a [i].num  1 3 5 7 2 4 6

再次扫描,直接O(N)搞定:

      a [i].data   1 2 3 4 5 6 7
      a [i].num   1 3 5 7 2 4 6 
         k           3 2 1 1 1 0

(而之前有的读者意识不到伴随数组的意义,是因为一般的人只考虑找一次,不会想到第二次或多次查找)

 

“很多中、小型公司自己的创造能力,包括人力,物力资源都有限,所以,他们的面试题目除了copy一些大公司的题库之外(当然,考察你对基础知识的掌握情况,是肯定不会放过的),还有一个途径就是让你在限定时间内(如十分钟),当场实现一些类似strcpy/strcat/strpbrk等库函数,这个主要看你对细节的把握,以及编程能力是否之扎实了。”

 

    原题为:

  1. 输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
    要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
    例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
  2. 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,
    使其和等于 m ,要求将其中所有的可能组合列出来。

 

    原题为:求500万以内的所有亲和数
如果两个数a和b,a的所有真因数之和等于b,b的所有真因数之和等于a,则称a,b是一对亲和数。
例如220和284,1184和1210,2620和2924。

 

    原题为:输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。

    例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。

 

  

 

 

    原题为:输入:一个最多含有n个不重复的正整数(也就是说可能含有少于n个不重复正整数)的文件,其中每个数都小于等于n,且n=10^7。
输出:得到按从小到大升序排列的包含所有输入的整数的列表。
条件:最多有大约1MB的内存空间可用,但磁盘空间足够。且要求运行时间在5分钟以下,10秒为最佳结果。

 

    “什么是最长公共子序列呢?好比一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。 举个例子,如:有两条随机序列,如 1 3 4 5 5 ,and 2 4 5 5 7 6,则它们的最长公共子序列便是:4 5 5。”

 

    本文分为以下4部分:

  1. 第一部分、从一道题,漫谈数据结构、以及压缩、位图算法,由上善若水.qinyu完成,
  2. 第二部分、遍历n个元素取出等概率随机取出其中之一元素,由BigPotato完成,
  3. 第三部分、提取出某日访问百度次数最多的那个IP,由luuillu完成,
  4. 第四部分、回文判断,由well完成。全文由July统稿完成。

 

本章讲解了以下几道题:

  1. 全排列;
  2. 跳台阶;
  3. 奇偶排序;
  4. 第一个只出现一次的字符;
  5. 一致性哈希算法。

 

    此文阐述了两个问题:

  1. 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。
  2. 你我在百度或谷歌搜索框中敲入本博客名称的前4个字“结构之法”,便能在第一个选项看到本博客的链接,如下图2所示:
  
                                      图2  谷歌中搜索关键字“结构之法”

  在上面所示的图2中,搜索结果“结构之法算法之道-博客频道-CSDN.NET”下有一段说明性的文字:“ 程序员面试、算法研究、编程艺术、红黑树4大经典原创系列集锦与总结 作者:July-- 结构之法 算法...”,我们把这段文字称为那个搜索结果的摘要,亦即最短摘要。我们的问题是,请问,这个最短摘要是怎么生成的呢?

第一~二十二章,完。

下期预告    

    下面,练练代码,同时,可能会作为编程艺术系列后续章节的内容:

    1、合并两个排序的链表。即输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。

//合并两个排序的链表
//copyright@2011 剑指offer
ListNode* Merge(ListNode* pHead1,ListNode* pHead2)
{
  if(pHead1 == NULL)
    return pHead2;
  else if(pHead == NULL)
    return pHead1;

  ListNode* pMergedHead = NULL;

  if(pHead1->m_nValue < pHead->m_nValue)
  {
    pMergedHead=pHead1;
    pMergedHead->m_pNext=Merge(pHead1->m_pNext,pHead2);
  }
  else
  {
    pMergedHead=pHead2;
    pMergedHead->m_pNext=Merge(pHead1,pHead2->m_pNext);
}

   return pMergedHead;
}

//非递归实现 链表合并排序
//copyright@ 2011 July
Node * Merge(Node *head1 , Node *head2)
{
    if ( head1 == NULL)
        return head2 ;
    if ( head2 == NULL)
        return head1 ;
    Node *head = NULL ;
    Node *p1 = NULL;
    Node *p2 = NULL;

    if ( head1->data < head2->data )
    {
        head = head1 ;
        p1 = head1->next;
        p2 = head2 ;
    }
    else
    {
        head = head2 ;
        p2 = head2->next ;
        p1 = head1 ;
    }

    Node *pcurrent = head ;
    while ( p1 != NULL && p2 != NULL)
    {
        if ( p1->data <= p2->data )
        {
            pcurrent->next = p1 ;
            pcurrent = p1 ;
            p1 = p1->next ;
        }
        else
        {
            pcurrent->next = p2 ;
            pcurrent = p2 ;
            p2 = p2->next ;
        }
    }

    if ( p1 != NULL )
        pcurrent->next = p1 ;
    if ( p2 != NULL )
        pcurrent->next = p2 ;

    return head ;
}
//好久没敲代码了,敲代码的感觉真舒服啊...

    2、反转链表

//第24题:反转链表
//pPrev<-pNode<-pNext
//copyright@ 何海涛Harry
ListNode* ReverseIteratively(ListNode* pHead)
{
  ListNode* pReversedHead = NULL;
  ListNode* pNode = pHead;
  ListNode* pPrev = NULL;
  while(pNode != NULL)         //pNode<=>m
  {
    ListNode* pNext = pNode->m_pNext;       //n保存在pNext下

    //如果pNext指为空,则当前结点pNode设为头。
    if(pNext == NULL)
      pReversedHead = pNode;

    // reverse the linkage between nodes
    pNode->m_pNext = pPrev;

    // move forward on the the list
    pPrev = pNode;
    pNode = pNext;
  }
  return pReversedHead;
}

//或者,这样写:
//head-> p-> q(01.17修正)
template<class T>
Node<T>* Reverse(Node<T>* head)
{
  p=head->next;

  while(p)
  {
    q=p->next;           //p->next先保存在q下
    p->next=head;  //p掉头指向head
    head=p;           //p赋给head
    p=q;                 //q赋给p。
    //上俩行即,指针前移嘛...
  }

  return head;
}

    编程艺术系列一如之前早已说过,“编程艺术系列最后可能要写到第六十章”(语出:程序员编程艺术第一~十章集锦与总结--面试、算法、编程)。所以,待续....

  如果你暂时无法很好的看懂或理解上文中某道题目或其解答,那只是因为你思考与接收问题的角度与我不同。不过,不用担心,你可以用你自己的方法看懂或理解,只不过这需要一些时间而已。好运!

 

后记

    来北京之前,我曾制作了本博客博文集锦第五期CHM文件,但到此文件的下载地址:http://download.csdn.net/detail/v_july_v/3738298,一看评论,发现很多朋友反应:下下来以后,只显示目录,不显示内容,不能看。

    其实,解决办法很简单,把打开文件之时出现提示框中的“打开文件前总是询问(W)”的勾选去掉即可。为此,下面演示一遍。

    1、从下载地址处下载好后,点击文件,把下面提示框中的“打开文件前总是询问(W)”的勾选去掉

    2、之后直接打开,便可以了,如下图所示:

    3、据读者反馈:如果是vista或者其他系统,则可以右键,属性,修改(一开始目录显示若有问题的话,那么在打开前,属性里面有个“unlock”,点一下就可以成功打开了)。

    So,读者自己不妨亲自再试一次?此文件的下载地址:http://download.csdn.net/detail/v_july_v/3738298。谢谢,希望此文件对你的面试、编程亦或算法学习有所帮助。其它资源下载地址如下:

    同时,朋友正在帮忙把我博客内所有文章整理成带目录+标签的PDF文档,到时候整理出来后,自会分享于大家。

 

    常有朋友问我,算法怎么学。说实话,以前在学校写博客,学算法只是毕业前夕没什么课,刚好空闲干的事情。一个人在没事做,无聊的时候总得找点什么事做,好比多数人选择玩游戏,玩牌也是一种消遣一样,无关追求,无关目的。如果您还不甚满意,可以再看看此文:由快速排序引申而来--如何学习算法。学算法,独有兴趣与激情足矣(当然,一定的语言和数据结构基础也是必不可少的);学编程,你我多敲代码吧。

    也有不少朋友要我推荐一些有关编程或算法学习的基础书籍、资料,在此,推荐如下十项,对的,仅十项:1、c++ primer;2、算法导论;3、c和指针/Effective C++;4、STL源码剖析;5、深度探索c++对象模型;6、编程珠玑;7、编程之美;8、深入理解计算机系统;9、程序员编程艺术(日后可能亦会改名);10、结构之法算法之道blog。

    至于工作,偶正在找一个合适的开发平台与一个合适的职位,努力。而从今往后,本博客内日后的更新可能与现在已有的内容会慢慢千差万别了。详情,读者与我共同期待吧。

 

    ok,闲话勿多。如果哪位读者能只看本文给出的原题,而立马反应出各个题目的思路、解决之道,那么,面试无忧矣。且请一定与我联系,定与君多多讨论、交流、请教之。当然,若其他读者发现了此一系列任何一篇文章中任何一题的漏洞、疏漏,亦或错误,也烦请不吝赐教,或者批评指正。你可以通过以下途径与我取得联系:

  1. 本博客算法交流群第16群:Algorithms_16群,30382647(11月内有效);
  2. 我的微博(博客左侧边栏):@v_JULY_v,http://weibo.com/julyweibo,我的邮箱,zhoulei0907@yahoo.cn
  3. 人人算法小组,http://xiaozu.renren.com/xiaozu/245753?feed
  4. TAOPP修订wiki,http://tctop.wikispaces.com/ ;
  5. 目前,个人正在与一位朋友建一论坛,以作群友们交流之地,我想到时候,不论是灌水的,还是搞技术的,都能找到属于自己的乐园。

    始终怀着以一颗谦卑的心,与大家共同学习、交流,以诸君为傲。完。July、二零一一年十一月二十三日。


Python123——第二次Python上机题 素数又称质数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。在一般领域,对正整数n,如果用2到 n-1之间的所有整数去除,均无法整除,则n为素数。(该算法可优化)‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬题目要求:求出100以内的所有素数并输出,素数之间以一个英文空格区分。无。 阅读详情

相关推荐

Linux中断子系统分析之(四):驱动程序申请中断

中断子系统中有一个重要的设计机制,那就是Top-half和Bottom-half,将紧急的工作放置在Top-half中来处理,而将耗时的工作放置在Bottom-half中来处理。 如果中断不分上下半部处理,那么意味着只有等上一个中断完成处理后才会打开中断,下一个中断才能得到响应。当某个中断处理处理时间较长时,很有可能就会造成其他中断丢失而无法响应,影响系统性能。 中断分成上下半部处理可以提高中断的响应能力,在上半部处理完成后便将中断打开,这样就可以响应其他中断了,等到中断退出的时候再进行下半部的处理。为了进

m0_46525308的博客 1197

解决PTA题:找错改错 6-13 有序表的增删改查操作

有序表的增删改查操作 分数 20 作者 张高燕 单位 浙大城市学院 首先输入一个正整数N(1≤N≤1000)和一个无重复元素的、从小到大排列的、N个元素的有序表,然后在屏幕上显示以下菜单(编号和选项)。

m0_74545731的博客 2750

【计算机科学导论实验】加法图灵机模拟 题解

本文提供计算机科学导论课程“图灵机加法器”实验的个人思路,仅供参考。

Chavapa's blog 2448

第 k 大的整数

求 n 个整数中第 k(1≤k≤n) 大的整数。 输入格式 n 和 k n 个整数 输出格式 第 k 大的整数 输入样例 10 3 2 5 -1 9 25 0 12 4 -7 12 输出样例 12 nth_element(a+l, a+k, a+r) 实现[l,r)[l,r)[l,r)范围内第k小的数放在有序的位置 #include <cstdio> #include &lt...

姚军 2455

程序员编程艺术第一~二十七集锦总结(你如何编程),及PDF免分下载

程序员编程艺术第一~二十七集锦总结(你如何编程)作者:July、编程艺术室出处:结构之法算法之道blog一、引言    自从去年7月份朋友花明月黯帮我制作了十三个经典算法研究的PDF文档(最新的十五个算法研究文档到这里下载:http://download.csdn.net/detail/v_july_v/4478027)之后,我便一直希望能有人再帮我制作我的另一个系列:程序员编程艺术的PDF

结构之法 算法之道 8万+

程序员编程艺术第一~集锦总结(你如何编程)--持续更新中

程序员编程艺术第一~集锦总结--面试、算法、编程 作者:July、编程艺术室。出处:http://blog.csdn.net/v_JULY_v 。    围绕“面试”、“算法”、“编程”三个主题的程序员编程艺术系列(简称TAOPP系列)从今年4月写第一篇起,至今快有2个月。2个月的创作中,写了十,共计13篇文。这是本人的第4大原创作品,不过之前微软面试100题系列,红黑树系列,及十三个

结构之法 算法之道 13万+

程序员编程艺术第一~四十集锦总结--面试、算法、编程

程序员编程艺术第一~四十集锦总结--面试、算法、编程   作者:July、编程艺术室。 出处:http://blog.csdn.net/v_JULY_v 。     围绕“面试”、“算法”、“编程”三个主题的程序员编程艺术系列(简称TAOPP系列)从今年4月写第一篇起,至今快有2个月。2个月的创作中,写了十,共计13篇文。这是本人的第4大原创作品,不过之前微软面试

心之所向,身之所往 904

输入一个整数n和n个整数,输出这n个整数的最大值。

输入一个整数n和n个整数,输出这n个整数的最大值。

y0ung0的博客 2128

C语言——用 堆 实现求N个数中第K大的数

问题描述: 在N(0<N<100000)个数中,找出第K(0<k<100000)大的数。 例如:1,2,3,4,5,6,7,8,9 中第3大的数为 7。 输入: 输入有多组数据,处理到文件结束。 每组数据有两行, 第一行包括两个数,一个正整数N和一个正整数K, 第二行有N个正整数。 输出: 对于每组数据,输出一个数,表示第K大的数,并...

连长少尉 7016

6-7 有序表的增删改查操作 (20分)

标题6-7 有序表的增删改查操作 (20分) 首先输入一个正整数N(1≤N≤1000)和一个无重复元素的、从小到大排列的、N个元素的有序表,然后在屏幕上显示以下菜单(编号和选项)。 [1] Insert [2] Delete [3] Update [4] Query [Other option] End 用户可以反复对该有序表进行插入、删除、修改和查找操作,也可以选择结束。当用户输入编号1~4和相关参数时,将分别对该有序表进行插入、删除、修改和查找操作,输入其他编号,则结束操作。 本题要求实现4个函数,分别

m0_51088567的博客 1万+

华为机试--简单题(一)

HJ54 表达式求值 知识点: 字符串;基础数学;栈 描述 给定一个字符串描述的算术表达式,计算出结果值。 输入字符串长度不超过 100 ,合法的字符包括 ”+, -, *, /, (, )” , ”0-9” 。 数据范围:运算过程中和最终结果均满足∣val∣≤2^31-1, 即只进行整型运算,确保输入的表达式合法 输入描述: 输入算术表达式 输出描述: 计算出结果值 示例1 输入:400+5 输出:405 代码: #include<stdio.h> #include<string.h&g

weixin_42297926的博客 2628

7-1 最大值和最小值 (10分)__C++

题目 给定一个正整数 N,接下来输入 N 个正整数(输入的数字大于等于 0,小于 1000)。 找出它们中的最大值和最小值,输出最大值减最小值。 输入格式 一个正整数 N 接下来连续输入 N 个正整数 输出格式 输入整数中的 最大值减去最小值 的结果 输入样例: 5 4 8 10 1 2 输出样例: 9 代码 #include <iostream> using namespace std; int main() { long int n,i=1,max=0,min=1000,a; cin

m0_51290571的博客 8309

【C语言】循环练习1 输入一个正整数n,然后输入n个整数,输出这n个整数中大于10的数字的个数和总和

#【C语言】循环练习1 描述: 输入一个正整数n,然后输入n个整数,输出这n个整数中大于10的数字的个数和总和 输入: 一个正整数n,然后是n个整数 输出 这n个整数中所有大于10的数字的个数以及大于10的数字的总和,两个数字中间用空格相隔,不要换行 样例输入: 3 12 5 2 样例输出: 2 32 [源码] #include <stdio.h> int main() { int n,i,j,k,l=0,m=0; scanf("%d",&n); for(i=1;i<=n;i++)

weixin_49937295的博客 1万+

人工智能基于Agent的AI原生应用架构设计:多模态工具链整合智能化范式转型系统实现

内容概要:本文介绍了《AI原生应用架构白皮书》的核心内容,系统阐述了AI原生应用的11大关键要素,涵盖模型发展、Agent驱动、以数据为中心、工具链整合等架构理念。白皮书结合40多位一线工程师的实践经验,深入探讨AI Agent的技术成熟度发展趋势,提出从单任务到多Agent协同的演进路径,并剖析了当前AI原生应用在开发效率、效果优化、系统可观测性、安全性等方面的挑战。文中重点介绍AI网关作为关键基础设施的作用,支持MCP/A2A协议、工具动态组装、智能路由流量治理,同时强调通过高代码框架(如AgentScope)在模型自主性业务可控性之间取得平衡,推动AI原生应用向高效、安全、可维护的方向发展。; 适合人群:具备一定AI或软件开发经验的技术人员、架构师、AI产品经理及企业技术决策者,尤其适合关注AI Agent落地系统化建设的从业者; 使用场景及目标:①理解AI原生应用的整体架构设计技术选型逻辑;②掌握AI网关、Agent框架、工具调用、可观测性等关键技术的实践方案;③指导企业在智能客服、代码辅助、供应链优化等场景构建生产级AI系统; 阅读建议:建议结合白皮书中的架构图实际案例进行系统学习,重点关注AI云原生融合的设计思路,并在实践中配合AI平台工具进行调试验证,以深入掌握AI原生应用的开发运维全流程。

上一篇: 程序员编程艺术第二十一~二章:发帖水王及扩展,与最短摘要生成(12.07修订)
下一篇: 编程艺术第二十三~四章&十一续:杨氏矩阵查找,倒排索引关键词Hash编码
NJP
NJP
博客等级 码龄14年 48粉丝 5原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值