黑甲教父 發表於 2019-9-11 23:24:00

python每日经典算法题5(基础题)+1(中难题)

<p>  现在,越来越多的公司面试以及考验面试对算法要求都提高了一个层次,从现在,我讲每日抽出时间进行5+1算法题讲解,5是指基础题,1是指1道中等偏难。希望能够让大家熟练掌握python的语法结构已经一些高级函数的应用。这些题目是在某些刷题的网站上登记的有水平的题目。这里如果有需要input的简单题,就略去了输出结果。如果时间充裕,则就会增加每日更多习题。</p>
<p>&nbsp;</p>
<p><span style="font-size: 16px"><strong>一:基础算法题5道</strong></span></p>
<p><strong>1.判断用户输入的年份是否为闰年</strong></p>
<p>题目解析:</p>
<p>(1)问题分析:<span style="color: rgba(255, 0, 0, 1)">能被4整除但不能被100整除的年份为普通闰年,能被400整除的年份为世纪闰年,判断是否满足上述情况</span>。</p>
<p>(2)算法分析:输入一个数,先判断如果是400的倍数,则满足;如果不是400的倍数,再判断如果该数能够被4整除,却不能被100整除,则满足。</p>
<p>(3)用到的python语法:input()标准输入函数,if判断语句,or,and逻辑运算符。</p>
<p>(4)博主答题代码:</p>
<div class="cnblogs_code">
<pre>n = int(input(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">请输入年份:</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 0, 255, 1)">if</span> n % 400 == 0 <span style="color: rgba(0, 0, 255, 1)">or</span> n % 4 == 0 <span style="color: rgba(0, 0, 255, 1)">and</span> n % 100 !=<span style="color: rgba(0, 0, 0, 1)"> 0:
    </span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{0}是闰年</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">.format(n))
</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
   </span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{0}不是闰年</span><span style="color: rgba(128, 0, 0, 1)">'</span>.format(n))</pre>
</div>
<p>(5)高效方法:<br>python 的 calendar 库中已经封装好了一个方法 isleap() 来实现这个判断是否为闰年:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> calendar

n </span>= int(input(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">请输入年份:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">))
year </span>=<span style="color: rgba(0, 0, 0, 1)"> calendar.isleap(n)
</span><span style="color: rgba(0, 0, 255, 1)">if</span> year ==<span style="color: rgba(0, 0, 0, 1)"> True:
    </span><span style="color: rgba(0, 0, 255, 1)">print</span> (<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">{0}是闰年</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">.format(n))
</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
    </span><span style="color: rgba(0, 0, 255, 1)">print</span> (<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">{0}不是闰年</span><span style="color: rgba(128, 0, 0, 1)">"</span>.format(n))</pre>
</div>
<p>&nbsp;</p>
<p><strong>2.判断一个数是否是质数</strong></p>
<p>题目解析:</p>
<p>(1)问题分析:<span style="color: rgba(255, 0, 0, 1)">除了1和它本身以外不再有其他的因数的数就是质数<span style="color: rgba(0, 0, 0, 1)">。</span></span></p>
<p>(2)算法分析:输入一个数,如果该数大于1,则从2开始循环到该数并一一整除该数,如果余数为0,则该数不是质数;否则该数是质数。</p>
<p>(3)用到的python语法:input()标准输入函数,for循环,if判断语句。</p>
<p>(4)博主答题代码:</p>
<div class="cnblogs_code">
<pre>n = int(input(<span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 0, 255, 1)">if</span> n &gt; 1<span style="color: rgba(0, 0, 0, 1)">:
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> i <span style="color: rgba(0, 0, 255, 1)">in</span> range(2<span style="color: rgba(0, 0, 0, 1)">,n):
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> n % i ==<span style="color: rgba(0, 0, 0, 1)"> 0:
            </span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{0}不是质数</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">.format(n))
            </span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{n}={a}*{b}</span><span style="color: rgba(128, 0, 0, 1)">'</span>.format(n=n,a=i,b=int(n/i)))    <span style="color: rgba(0, 128, 0, 1)"># </span><span style="color: rgba(0, 128, 0, 1)">这里也可为b=n//i</span>
            <span style="color: rgba(0, 0, 255, 1)">break</span>
      <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
            </span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{0}是质数</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">.format(n))
            </span><span style="color: rgba(0, 0, 255, 1)">break</span></pre>
</div>
<p>这时如果想把非质数的所有非1与自己的因数输出,则可以改为如下代码:</p>
<div class="cnblogs_code">
<pre>n = int(input(<span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 0, 255, 1)">if</span> n &gt; 1<span style="color: rgba(0, 0, 0, 1)">:
    m1 </span>= 0;m2 =<span style="color: rgba(0, 0, 0, 1)"> 0
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> i <span style="color: rgba(0, 0, 255, 1)">in</span> range(2<span style="color: rgba(0, 0, 0, 1)">,n):
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> n % i ==<span style="color: rgba(0, 0, 0, 1)"> 0:
            str </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{0}不是质数</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">.format(n)
            </span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{n}={a}*{b}</span><span style="color: rgba(128, 0, 0, 1)">'</span>.format(n=n,a=i,b=int(n/i)))    <span style="color: rgba(0, 128, 0, 1)"># </span><span style="color: rgba(0, 128, 0, 1)">这里也可为b=n//i</span>
            m1 = 1;m2 = 1
      <span style="color: rgba(0, 0, 255, 1)">elif</span> m1==<span style="color: rgba(0, 0, 0, 1)">0:
            </span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{0}是质数</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">.format(n))
            </span><span style="color: rgba(0, 0, 255, 1)">break</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> .count(1) == 2<span style="color: rgba(0, 0, 0, 1)">:
      </span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{0}不是质数</span><span style="color: rgba(128, 0, 0, 1)">'</span>.format(n))</pre>
</div>
<p>(5)高效方法:</p>
<div class="cnblogs_code">
<pre>num = int(input(<span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">))
i </span>= 2
<span style="color: rgba(0, 0, 255, 1)">while</span> i &lt;<span style="color: rgba(0, 0, 0, 1)"> num:
    s </span>= num %<span style="color: rgba(0, 0, 0, 1)"> i
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> s ==<span style="color: rgba(0, 0, 0, 1)"> 0:
      </span><span style="color: rgba(0, 0, 255, 1)">break</span>
    <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
      i </span>+= 1
<span style="color: rgba(0, 0, 255, 1)">if</span> num ==<span style="color: rgba(0, 0, 0, 1)"> i:
    </span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">{0}是质数</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">.format(num))
</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
    </span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">{0}不是质数</span><span style="color: rgba(128, 0, 0, 1)">"</span>.format(num))</pre>
</div>
<p>&nbsp;</p>
<p><strong>3.输出指定范围内的素数</strong></p>
<p>(1)题目分析:<span style="color: rgba(255, 0, 0, 1)">素数就是质,上一题已经介绍了如何求质数,这里我们需要加一个范围<span style="color: rgba(0, 0, 0, 1)">。</span></span><br>(2)算法分析:把上一题判断的内容放在一个for循环选择范围里进行分析。</p>
<p>(3)用到的python语法:input()标准输入函数,map函数,for循环,if判断语句。<br>(4)博主答题代码:</p>
<div class="cnblogs_code">
<pre>my_index1,my_index2 = map(int,input(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">请选择一个范围:</span><span style="color: rgba(128, 0, 0, 1)">'</span>).split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">,</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">))
result </span>=<span style="color: rgba(0, 0, 0, 1)"> []

</span><span style="color: rgba(0, 0, 255, 1)">for</span> num <span style="color: rgba(0, 0, 255, 1)">in</span> range(my_index1,my_index2+1<span style="color: rgba(0, 0, 0, 1)">):
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> num &gt; 1<span style="color: rgba(0, 0, 0, 1)">:
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> i <span style="color: rgba(0, 0, 255, 1)">in</span> range(2<span style="color: rgba(0, 0, 0, 1)">,num):
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (num % i) ==<span style="color: rgba(0, 0, 0, 1)"> 0:
                </span><span style="color: rgba(0, 0, 255, 1)">break</span>
      <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
            result.append(num)
</span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{a}到{b}所有的质数有:{c}</span><span style="color: rgba(128, 0, 0, 1)">'</span>.format(a = my_index1,b = my_index2,c = result))</pre>
</div>
<p>这里的if和else是就近匹配,和上面的不同,这就避免了重复,这是要注意的一点。</p>
<p>展示这是最简单的方法,如果大家有好的方法,请评论。</p>
<p>&nbsp;</p>
<p><strong>4.约瑟夫生者死者小游戏</strong></p>
<p>30 个人在一条船上,超载,需要 15 人下船。</p>
<p>于是人们排成一队,排队的位置即为他们的编号。</p>
<p>报数,从 1 开始,数到 9 的人下船。</p>
<p>如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?</p>
<p>这一题可以扩展为:</p>
<p><span style="color: rgba(255, 0, 0, 1)">m个人在一条船上,超载,需要n人下船。</span></p>
<p><span style="color: rgba(255, 0, 0, 1)">于是人们排成一队,排队的位置即为他们的编号。</span></p>
<p><span style="color: rgba(255, 0, 0, 1)">报数,从 1 开始,数到 k 的人下船。</span></p>
<p><span style="color: rgba(255, 0, 0, 1)">如此循环,直到船上仅剩 m - n人为止,问都有哪些编号的人下船了呢?</span></p>
<p>(1)题目分析:</p>
<p><img src="https://img2018.cnblogs.com/blog/1735560/201909/1735560-20190911211040211-451360783.png" alt="" width="566" height="382"></p>
<p>(2)算法分析:这里设置编号从1开始,先给出从1到m的所有编号,用一个列表表示,需要n个人下船,则船上就生了m-n个人。以此循环递归,其实也可以转化为递归问题。但这里每次递归,当找到数到编号k,就把编号k所在的序号,就是编号删除。这里可以设置一个外部变量,从第一个编号index开始,当index=k时,把编号重新置为1,每次都这样,直到循环完毕,直到所有最后剩余元素个数为m-n。</p>
<p>(3)用到的python语法:for循环,函数,列表操作,列表切片。</p>
<p>(4)博主答题代码:</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> yueSeFu(m,n,k):
    serial_num </span>= list(range(1,m +1))    <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 创建从1到m的序号</span>
    index = 0                            <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 设置外部变量index</span>
    <span style="color: rgba(0, 0, 255, 1)">while</span> len(serial_num) &gt; m - n:      <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 当最后剩余人数为m - n之前,一直进行下面的程序</span>
      <span style="color: rgba(0, 0, 255, 1)">for</span> i <span style="color: rgba(0, 0, 255, 1)">in</span> serial_num:            <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 遍历每个编号</span>
            index += 1                     <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 把外部变量index进行真实遍历</span>
            <span style="color: rgba(0, 0, 255, 1)">if</span> index == k:                <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 当外部变量index找到k时,进行下面代码块的操作</span>
                serial_num.remove(i)    <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 移除需要下船的人的编号</span>
                index = 1                <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 这时候index已经找到序号k了,就要重新遍历</span>
                <span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{0}号人下船了</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">.format(i))

</span><span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 128, 1)">__name__</span> == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
    </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 传入起始人数m,需要下船的人数n,数到多少下船的序号k,这里可自行设置</span>
    yueSeFu(30,15,9)</pre>
</div>
<p>(5)高效方法:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> yueSeFu(m,n,k):
    people </span>= list(range(1, m+1<span style="color: rgba(0, 0, 0, 1)">))
    i </span>=<span style="color: rgba(0, 0, 0, 1)"> 0
    </span><span style="color: rgba(0, 0, 255, 1)">while</span> len(people) &gt; m -<span style="color: rgba(0, 0, 0, 1)"> n:
      i </span>+= (k - 1<span style="color: rgba(0, 0, 0, 1)">)
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> i &gt;=<span style="color: rgba(0, 0, 0, 1)"> len(people):
            i </span>-=<span style="color: rgba(0, 0, 0, 1)"> len(people)
      </span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">{}号下船了</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">.format(people))
      </span><span style="color: rgba(0, 0, 255, 1)">del</span><span style="color: rgba(0, 0, 0, 1)"> people

</span><span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 128, 1)">__name__</span> == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
    </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 传入起始人数m,需要下船的人数n,数到多少下船的序号k</span>
    yueSeFu(30,15,9)</pre>
</div>
<p>&nbsp;</p>
<p><strong>5.二分查找,返回某个值在数组中的索引</strong></p>
<p>(1)题目分析:二分搜索是一种在有序数组中查找某一特定元素的搜索算法。从数组的中间元素开始,正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。</p>
<p>(2)算法分析:这里重复查找需要用到递归,用到一个一维数组,先判断数组查找的元素末尾下标是否大于等于1。如果是的话,就要先找到中间位置,如果大于中间位置,就只比较左边的元素重新递归;如果小于中间位置,则比较右边的元素重新递归。找不到就返回-1。<br>(3)用到的python语法:if判断语句,函数,递归算法。</p>
<p>(4)博主答题代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">def</span> twoSearch(x,arr,begin,end):    <span style="color: rgba(0, 128, 0, 1)"># </span><span style="color: rgba(0, 128, 0, 1)">x为要查询的元素,arr为数组,begin和and是每次查找的范围</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> end &gt;= 1<span style="color: rgba(0, 0, 0, 1)">:
      mid </span>= int(begin + (end-1)/2)    <span style="color: rgba(0, 128, 0, 1)"># </span><span style="color: rgba(0, 128, 0, 1)">每次范围的元素中间位置</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> int(arr) ==<span style="color: rgba(0, 0, 0, 1)"> x:
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mid
      </span><span style="color: rgba(0, 0, 255, 1)">elif</span> int(arr) &gt; x:      <span style="color: rgba(0, 128, 0, 1)"># </span><span style="color: rgba(0, 128, 0, 1)">元素小于中间的元素,需要比较左边的元素</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> twoSearch(x,arr,begin,end - 1<span style="color: rgba(0, 0, 0, 1)">)
      </span><span style="color: rgba(0, 0, 255, 1)">else</span>:                  <span style="color: rgba(0, 128, 0, 1)"># </span><span style="color: rgba(0, 128, 0, 1)">元素大于中间的元素,需要比较右边的元素</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> twoSearch(x,arr,begin + 1<span style="color: rgba(0, 0, 0, 1)">,end)
    </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> -1

<span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 128, 1)">__name__</span> == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
    my_arr </span>= list(map(int,input(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">请输入数组:</span><span style="color: rgba(128, 0, 0, 1)">'</span>).split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">,</span><span style="color: rgba(128, 0, 0, 1)">'</span>)))    <span style="color: rgba(0, 128, 0, 1)"># </span><span style="color: rgba(0, 128, 0, 1)">返回可迭代对象</span>
    my_x = int(input(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">请输入要查找的元素:</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">))
    result </span>= twoSearch(my_x, my_arr, 0, len(my_arr) - 1<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> result != -1<span style="color: rgba(0, 0, 0, 1)">:
      </span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">元素在数组中的索引为:{0}</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">.format(result))
    </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
      </span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">元素不在数组中</span><span style="color: rgba(128, 0, 0, 1)">')</span></pre>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 16px"><strong>二:中等算法题1道</strong></span></p>
<p><strong>1.两数之和</strong></p>
<p>给定一个整数数组&nbsp;<code>nums</code>&nbsp;和一个目标值&nbsp;<code>target</code>,请你在该数组中找出和为目标值的那&nbsp;两个&nbsp;整数,并返回他们的数组下标。</p>
<p>示例:</p>
<p>给定 nums = , target = 9</p>
<p>因为 nums + nums = 2 + 7 = 9<br>所以返回 </p>
<p>(1)算法解析:<span style="color: rgba(255, 0, 0, 1)">我们给出一个列表,进行两次循环,就可以得到结果</span>。<br>(2)博主代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> twoSum(nums, target):
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> index1,i <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> enumerate(nums):
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> index2,j <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> enumerate(nums):
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> i+j == target <span style="color: rgba(0, 0, 255, 1)">and</span> i !=<span style="color: rgba(0, 0, 0, 1)"> j:
                </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> index1,index2


a </span>= list(map(int,input().split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">,</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)))
b </span>=<span style="color: rgba(0, 0, 0, 1)"> int(input())
</span><span style="color: rgba(0, 0, 255, 1)">print</span>(list(twoSum(a,b)))</pre>
</div>
<p>主要代码为:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">for</span> index1,i <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> enumerate(nums):
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> index2,j <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> enumerate(nums):
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> i+j == target <span style="color: rgba(0, 0, 255, 1)">and</span> i !=<span style="color: rgba(0, 0, 0, 1)"> j:
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> index1,index2</pre>
</div>
<p>(3)代码问题</p>
<p>  但是在运行很多个数字的列表中,需要两次循环遍历列表,如果列表的长度为n,则时间复杂度为O(n),时间执行效率太差,最差为O(n^2),故上面的代码实际上是不太可取的。</p>
<p>(4)高级算法</p>
<p>下面有一些改进的高级一点的算法:</p>
<p><strong>列表生成式三行代码搞定:</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">for</span> i <span style="color: rgba(0, 0, 255, 1)">in</span> range(len(nums)):    <span style="color: rgba(0, 128, 0, 1)"># </span><span style="color: rgba(0, 128, 0, 1)">循环遍历列表</span>
      <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 这里是用和减去列表中的某一元素,并且两个元素下标不同,就返回两个下标</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span>(target-nums <span style="color: rgba(0, 0, 255, 1)">in</span> nums <span style="color: rgba(0, 0, 255, 1)">and</span> i != nums.index(target-<span style="color: rgba(0, 0, 0, 1)">nums)):
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> )]</pre>
</div>
<p>执行用时 :1284ms,内存消耗 :14.7MB左右,比上面的代码节省了一层循环遍历的过程。</p>
<p><strong>字典查找,利用哈希表,不用遍历:</strong></p>
<div class="cnblogs_code">
<pre>my_dict = {}                        <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 创建一个字典</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> index, num1 <span style="color: rgba(0, 0, 255, 1)">in</span> enumerate(nums):    <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 利用函数enumerate输出列表或数组的下标和元素</span>
      num2 = target - num1            <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 另一个元素</span>
      <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 这里是判断,如果字典中有另一个元素值的话,返回下标,以及该元素下标</span>
      <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 这里由于字典是键值对,就避免了两个元素和符合,单元素是同一个元素的情况</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> num2 <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> my_dict:               
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> , index]
      </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 把字典中的元素对应于键</span>
      my_dict =<span style="color: rgba(0, 0, 0, 1)"> index
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> -1</pre>
</div>
<p>执行用时 :68ms,内存消耗 :15 MB左右,时间效率更高。</p>
<p>利用集合进行操作,效率和字典差不多:</p>
<div class="cnblogs_code">
<pre>my_set =<span style="color: rgba(0, 0, 0, 1)"> set(nums)
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> i, v <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> enumerate(nums):
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (target - v) <span style="color: rgba(0, 0, 255, 1)">in</span> my_set <span style="color: rgba(0, 0, 255, 1)">and</span> i != nums.index(target -<span style="color: rgba(0, 0, 0, 1)"> v):
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> </pre>
</div>
<p>执行用时 :80ms,内存消耗 :15 .2MB左右。</p>
<p>&nbsp;</p>
<p><span style="color: rgba(255, 0, 0, 1)">总结:</span></p>
<p><span style="color: rgba(0, 0, 0, 1)">  1.用python字典或集合的效率要高很多,不建议常用列表。</span></p>
<p><span style="color: rgba(0, 0, 0, 1)">  2.生成一个整数序列可以先生成一个可迭代对象</span></p>
<p><span style="color: rgba(0, 0, 0, 1)">    比如生成一个只有整数的可迭代对象:</span></p>
<p><span style="color: rgba(255, 0, 0, 1)">    </span>map(int,input('请选择一个范围:').split(','))</p>
<p>  3.calendar.isleap(n可以判断是否为闰年。</p>
<p>  4.列表生成式常用可以减少代码量,当然是有必要用列表的时候。</p>
<p>  5.enumerate对既需要元素和下标值的序列很有用。</p><br><br>
来源:https://www.cnblogs.com/ITXiaoAng/p/11507516.html
頁: [1]
查看完整版本: python每日经典算法题5(基础题)+1(中难题)