免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yzc2002
打印 上一主题 下一主题

据说是google的面试题,看谁的快 [复制链接]

论坛徽章:
0
81 [报告]
发表于 2006-04-19 14:32 |只看该作者
希望各位注意一下自己的言词,另外,尽量不要在技术帖子里面说一些无关的灌水回复,大家一同维护论坛的氛围,谢谢!

论坛徽章:
0
82 [报告]
发表于 2006-04-20 11:24 |只看该作者

我的很慢,结果比楼主的多一个数

耗时10分钟,与一秒的差距相当~的大。Win2K SP4, PIV2.8GHz.

#include "iostream"
#include "time.h"

using namespace std;

int getm(int n)
{
        int nums=0;
        while(n>0)
        {
                while(n%10==0)
                {
                        n/=10;
                }
                while(n%10==1)
                {
                        n/=10;
                        ++nums;
                }
                n/=10;
        }
        return nums;
}


int main(int argc, char* argv[])
{
        unsigned long iter=1;
        unsigned long total=0;
        //
        time_t   start, finish;
        double   elapsed_time;

        time( &start );
        while(iter<0xFFFFFFFF)
        {
                total+=getm(iter);
                if(total==iter)
                {
                        time( &finish );
                        elapsed_time = difftime( finish, start );
                        cout<<"Time: "<<elapsed_time<<"s, Num: "<<iter<<endl;
                }
                ++iter;
        }
        time( &finish );
        elapsed_time = difftime( finish, start );
        cout<<"Time used: "<<elapsed_time<<endl;

        return 0;
}

论坛徽章:
0
83 [报告]
发表于 2006-04-20 16:50 |只看该作者
楼上的算法有问题吧?

论坛徽章:
0
84 [报告]
发表于 2006-05-29 19:06 |只看该作者
1  takes 0 ms
199981  takes 843 ms
199982  takes 0 ms
199983  takes 0 ms
199984  takes 0 ms
199985  takes 0 ms
199986  takes 0 ms
199987  takes 0 ms
199988  takes 0 ms
199989  takes 0 ms
199990  takes 0 ms
200000  takes 0 ms
200001  takes 0 ms
1599981  takes 6703 ms
1599982  takes 0 ms
1599983  takes 0 ms
1599984  takes 0 ms
1599985  takes 0 ms
1599986  takes 0 ms
1599987  takes 0 ms
1599988  takes 0 ms
1599989  takes 0 ms
1599990  takes 0 ms
2600000  takes 5172 ms
2600001  takes 0 ms
前面那位好像比我的速度快哦

论坛徽章:
0
85 [报告]
发表于 2006-05-30 08:04 |只看该作者
数学系的题目,我做不了啊。。。

论坛徽章:
0
86 [报告]
发表于 2006-05-30 13:47 |只看该作者
#include <math.h>
#include <stdlib.h>
#include <fstream.h>
#include <time.h>



int main(){
        ofstream outfile("output.txt",ios:ut);
        if(! outfile)
        {
                cerr<<"open error!"<<endl;
                exit(1);
        }
        //  判断n位数num是否满足
        unsigned long temp,pre=0;

        clock_t start,end;
       
        start = clock();
        for(int n = 1 ;n <= 10 ;n++)
        {
                for(unsigned long num = unsigned long(pow(10,n-1));num < pow(10,n)&&num < 4294967295;num++)//4294967295
                {                       
                        //计算num含有“1”的个数
                        int count = 0;
                        temp = num;
                        for(int i = n; i > 0; i--)
                        {
                                int val = int(temp/pow(10,i - 1));
                                if(val == 1) count++;
                                temp -= unsigned long(val * pow(10,i - 1));
                               
                        }
                        //总的“1”的个数
                        unsigned long total = pre + count;
                        pre = total;//计算下一个时用
                        if(num == total)
                        {
                                end = clock();
                                outfile<< num <<"  takes "<<(end - start)<<" ms "<<endl;
                                start = clock();
                        }
                }
        }
                outfile.close();
        return 1;
}
个人觉得调用函数保留结果供下一个计算是关键,(没有编成函数的形式)。f(n+1)=f(n)+(n+1所含有“1”的个数),下面是结果,用了一个半小时左右算到1111111110,后面的没有合适的了,时间也就没记录。

[ 本帖最后由 sun_yuyi 于 2006-5-30 13:55 编辑 ]

论坛徽章:
0
87 [报告]
发表于 2006-05-30 13:47 |只看该作者
1  takes 0 ms
199981  takes 859 ms
199982  takes 0 ms
199983  takes 0 ms
199984  takes 0 ms
199985  takes 0 ms
199986  takes 0 ms
199987  takes 0 ms
199988  takes 0 ms
199989  takes 0 ms
199990  takes 0 ms
200000  takes 0 ms
200001  takes 0 ms
1599981  takes 6719 ms
1599982  takes 0 ms
1599983  takes 0 ms
1599984  takes 0 ms
1599985  takes 0 ms
1599986  takes 0 ms
1599987  takes 0 ms
1599988  takes 0 ms
1599989  takes 0 ms
1599990  takes 0 ms
2600000  takes 4953 ms
2600001  takes 0 ms
13199998  takes 54500 ms
35000000  takes 121594 ms
35000001  takes 0 ms
35199981  takes 1125 ms
35199982  takes 0 ms
35199983  takes 0 ms
35199984  takes 0 ms
35199985  takes 0 ms
35199986  takes 0 ms
35199987  takes 0 ms
35199988  takes 0 ms
35199989  takes 0 ms
35199990  takes 0 ms
35200000  takes 0 ms
35200001  takes 0 ms
117463825  takes 470468 ms
500000000  takes 2368375 ms
500000001  takes 0 ms
500199981  takes 1250 ms
500199982  takes 0 ms
500199983  takes 0 ms
500199984  takes 0 ms
500199985  takes 0 ms
500199986  takes 0 ms
500199987  takes 0 ms
500199988  takes 0 ms
500199989  takes 0 ms
500199990  takes 0 ms
500200000  takes 0 ms
500200001  takes 0 ms
501599981  takes 8657 ms
501599982  takes 0 ms
501599983  takes 0 ms
501599984  takes 0 ms
501599985  takes 0 ms
501599986  takes 0 ms
501599987  takes 0 ms
501599988  takes 0 ms
501599989  takes 0 ms
501599990  takes 0 ms
502600000  takes 6203 ms
502600001  takes 0 ms
513199998  takes 65640 ms
535000000  takes 134953 ms
535000001  takes 0 ms
535199981  takes 1235 ms
535199982  takes 0 ms
535199983  takes 0 ms
535199984  takes 0 ms
535199985  takes 0 ms
535199986  takes 0 ms
535199987  takes 0 ms
535199988  takes 0 ms
535199989  takes 0 ms
535199990  takes 0 ms
535200000  takes 0 ms
535200001  takes 0 ms
1111111110  takes 3645640 ms

配置:CPU--1.8G   内存--256M

[ 本帖最后由 sun_yuyi 于 2006-5-30 13:51 编辑 ]

论坛徽章:
0
88 [报告]
发表于 2006-06-01 21:18 |只看该作者
也可以循环的把1-----N   全部转换成char *  后再用strtok    strstr  等函数 去获取1出现的次数  然后累加啥

个人感觉  这样处理效率 可能会高些

论坛徽章:
0
89 [报告]
发表于 2006-06-06 16:58 |只看该作者
直接照下面转一圈
for(i=1;i < 0xFFFFFFFF-1; i++ )
{
                __asm{nop};
}
时间都要5s,不能挨个算。

论坛徽章:
0
90 [报告]
发表于 2006-06-07 15:38 |只看该作者
我的蛮力方法193秒,想象不到为什么有些人能用到1个多小时。
楼主的方法需要证明,一般人不会也不愿意为这个小东西做个证明简化计算,呵呵,我也做不出来,只好蛮力了。

liubinbj%sina.com

//一个整数中1的个数

inline int count(int n)       
{
        int c=0;
        while(n>0)
        {
                if(n%10==1) c++;
                n/=10;
        };
        return c;
}

#ifdef WIN32
#include <winbase.h>

    static LARGE_INTEGER _tstart, _tend;
    static LARGE_INTEGER freq;

    void time_start(void)
    {
        static int first = 1;

        if(first) {
            QueryPerformanceFrequency(&freq);
            first = 0;
        }
        QueryPerformanceCounter(&_tstart);
    }
    void time_end(void)
    {
        QueryPerformanceCounter(&_tend);
    }

    double time_val()
    {
        return ((double)_tend.QuadPart -
                    (double)_tstart.QuadPart)/((double)freq.QuadPart);
    }

#else
/*linux系统*/
/*包含了timeval的结构定义*/
#include <sys/time.h>
    static struct timeval _tstart, _tend;
    static struct timezone tz;

    void time_start(void)
    {
        gettimeofday(&_tstart, &tz);
    }
    void time_end(void)
    {
        gettimeofday(&_tend,&tz);
    }

    double time_val()
    {
        double t1, t2;

        t1 =  (double)_tstart.tv_sec + (double)_tstart.tv_usec/(1000*1000);
        t2 =  (double)_tend.tv_sec + (double)_tend.tv_usec/(1000*1000);
        return t2-t1;
    }
#endif


int total=0;
int lastfit=1;
main()
{
        unsigned long i=1;
        time_start();
        for(i=1;i<1111111111;i++)
        {
                total+=count(i);
                if(total==i) {
                        lastfit=i;        //最后匹配
                        printf("%ld\n",i);
                }
        }

        time_end();
        printf("end!time=%f",time_val());
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP