使用strlen()时超出时限?

时间:2015-06-30 21:28:44

标签: c segmentation-fault strlen time-limiting

&lt; p&gt;以下代码按预期工作,此代码打印字符串中出现次数最多的字符:&lt; / p&gt; &lt; pre&gt;&lt; code&gt; #include&lt; stdio.h&gt; #include&lt; string.h&gt; #include&lt; math.h&gt; #include&lt; stdlib.h&gt; int main(){     long int i,a [26] = {0},m = 0,c = 0;     char s [1000001];     的scanf(&#34;%S&#34;,S);     for(i = 0; s [i]!=&#39; \ 0&#39 ;; i ++){         一个[S [I] - &#39;一个&#39;] ++;     }     for(i = 0; i <26; i ++)         {             if(a [i]&gt; m){             m = a [i];             c = i;             }         }     printf(&#34;%c&#34;,&#39; a&#39; + c);     返回0; } &LT; /代码&GT;&LT; /预&GT; &lt; p&gt;但是当我使用&lt; code&gt; strlen()&lt; / code&gt;它会导致时间限制错误:&lt; / p&gt; &lt; pre&gt;&lt; code&gt; #include&lt; stdio.h&gt; #include&lt; string.h&gt; #include&lt; math.h&gt; #include&lt; stdlib.h&gt; int main(){     long int i,a [26] = {0},m = 0,c = 0;     char s [1000001];     的scanf(&#34;%S&#34;,S);     for(i = 0; i&lt; strlen(s); i ++){         一个[S [I] - &#39;一个&#39;] ++;     }     for(i = 0; i <26; i ++)         {             if(a [i]&gt; m){             m = a [i];             c = i;             }         }     printf(&#34;%c&#34;,&#39; a&#39; + c);     返回0; } &LT; /代码&GT;&LT; /预&GT; &lt; p&gt;问题在哪里?&lt; / p&gt;

2 个答案:

答案 0 :(得分:2)

for (i=0;i<strlen(s);i++)

此代码正在调用strlen(s)函数。它需要O(n)时间复杂度。

for (i=0;s[i]!='\0';i++)

此代码不调用任何函数,因此比前一代快得多。

首先,在i的每次迭代中检查s的长度,O(n)找到最后的0,所以需要O(n^2),第二种情况是{{1} }。

此处,O(n)非常大,可供计算。

答案 1 :(得分:1)

strlen()

根据操作系统的不同,这对于堆栈来说可能太大了。您应该使用NUL或在文件范围内动态分配。即使堆栈足够大,在堆栈上放置如此大的数组也不是好习惯。

除此之外:对每个循环迭代计算strlen,在字符串中搜索s终止符。对于最坏情况(最大长度),size_t slen = strlen(s); for ( i = 0 ; i < slen ; i++ ) { 处理1000000次,搜索Uncaught TypeError: Cannot use 'in' operator to search for 'length' in (O(n ** 2))的所有1000001个位置。

您应该将它分配给循环外的变量并使用它来比较:

jQuery(document).ready(function ($) {

  $('#checkbox').change(function(){
    setInterval(function () {
        moveRight();
    }, 3000);
  });
  
	var slideCount = $('#slider ul li').length;
	var slideWidth = $('#slider ul li').width();
	var slideHeight = $('#slider ul li').height();
	var sliderUlWidth = slideCount * slideWidth;
	
	$('#slider').css({ width: slideWidth, height: slideHeight });
	
	$('#slider ul').css({ width: sliderUlWidth, marginLeft: - slideWidth });
	
    $('#slider ul li:last-child').prependTo('#slider ul');

    function moveLeft() {
        $('#slider ul').animate({
            left: + slideWidth
        }, 200, function () {
            $('#slider ul li:last-child').prependTo('#slider ul');
            $('#slider ul').css('left', '');
        });
    };

    function moveRight() {
        $('#slider ul').animate({
            left: - slideWidth
        }, 200, function () {
            $('#slider ul li:first-child').appendTo('#slider ul');
            $('#slider ul').css('left', '');
        });
    };

    $('a.control_prev').click(function () {
        moveLeft();
    });

    $('a.control_next').click(function () {
        moveRight();
    });

});    

或坚持第一个版本,也没关系。