| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3719 人关注过本帖, 1 人收藏
标题:两道面试题的解答,找工作的兄弟看过来~~~
只看楼主 加入收藏
wsj3000
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:78
专家分:161
注 册:2009-8-4
结帖率:66.67%
收藏(1)
已结贴  问题点数:20 回复次数:50 
两道面试题的解答,找工作的兄弟看过来~~~
感谢大家参与,问题已经解决,结贴给分!
StarWing83 完整给出两道题的答案,而且第一题算法复杂度比我的好,第二题都是O(n)算持平,得分13/20 (他的算法分别在50楼,40楼)
Devil_W 的确是比较厉害的,直接看出来第一题用dp算法最好,但是没有给出完整答案,给分2/20,不过还是比较佩服他,算法水平比我好多了~~~
hahayezhe 首先看出来第二题有问题,并且提出修改方案,给分5/20表示感谢~~~


1.编写一个程序,返回两个字符串的最大公串!例如,“adbccadebbca”和“edabccadece”,返回“bccade”。
2.有个数组arr[100]存放了100个数,这100个数取自1-99(此处改为0-99),且只有两个相同的数,剩下的98个数不同,写一个搜索算法找出相同的那个数的值.(注意空间效率时间效率尽可能要低).
发现有些兄弟的代码没有经过测试就发上来,下面给个测试方法,以便大家写好代码后测试一下:
1. 编译成可运行程序a.out,测试命令: ./a.out adbccadebbca edabccadece
返字符串:bccade
2.补全下面代码中的search_same(int arr[], int n);定义,(假设arr[]中随机存0-99数字,34没有出现,58出现2次,其他数字出现1次,用search_same函数找出重复数字58)
程序代码:
#include <stdio.h>

int search_same(int arr[], int n);

int main()
{
    int arr[100];
    int i;

    for(i=0; i<100; i++){
        arr[i] = i;
    }
    arr[34] = 58;

    fprintf(stdout, "The same one:%d\n", search_same(arr, 100));

    return 0;
}

我已经写了自己的代码放在附件里面,不过是加密的,过几天给密码;
给分条件,算法空间效率和时间效率比我写的更好。
code.rar (1.46 KB)
附件密码:done!
恩,请给出大致思路,以便大家更容易看懂~~~~
哈哈,没想到有这么多人回帖,先谢谢大家了。

附件密码已经发了,就在附件后面(纯白颜色的字体),请ctrl+a全选就看见了。
其实这些题是网上没事的时候搜到的,原来一共十几道,感觉这两道比较有意思,所在放上来了~~~~~

十楼的兄弟,你太强了,我看了几天咋就没想到是这么回事的呢,感叹!~~~~,说声佩服~~~(已经按照11楼的修改题目)

我的算法思路:
1.最简单的方法是一一比较,大致次数是 关于F的函数,F( strlen(str1) + strlen(str1)*strlen(str2) );想一下,有很多重复比较的,最好是扫描一次str2,然后把所有127个字符的位置存储在一个单链表数组listarr[127]中,字符的数值就是对应的数组下标;这样str1通过listarr与str2对应的字符比较,一共只需F( strlen(str1) + strlen(str2)*2 );就可以了。-----算法复杂度:最大O(n^2),空间复杂度O(n)。

2.恩,尽量少空间,所以方法如下:从头扫描数组,并用value = arr[i]%100来取元素值,然后,检查arr[value]是否大于100,如果是那就是这个数,如果不是就把arr[value] += 100;--------算法复杂度:O(n),空间复杂度:O(1),
其实原理还是做标记,但是用原来的数+100,然后用模100取值,这样做标记空间占用几乎是0。
(题目修改后这个思路同样适用)

我的代码已经发在22楼,由于题目修改,第二题稍做修改。思路就是我上面写的~~~

[ 本帖最后由 wsj3000 于 2010-5-3 12:17 编辑 ]
搜索更多相关主题的帖子: 找工作 兄弟 面试 解答 
2010-05-01 12:33
程冬水
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-05-01 17:02
wsj3000
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:78
专家分:161
注 册:2009-8-4
收藏
得分:0 
(1)请您先运行通过再贴上来吧,我运行了下一大堆报错;
(2)建议时间复杂度上再优化下吧~~~~~
2010-05-01 17:36
程冬水
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-05-01 17:38
kingsroot
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:284
专家分:1159
注 册:2010-3-28
收藏
得分:0 
楼主 你把你的算法时间和空间 贴出来  做个参考
2010-05-01 17:53
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:0 
第一题 暂未找到好方法 如果借助范型编程 可能好点

int main()
{ //因为其为1-99的数字 而且只有一个重复
    int a[100];//请赋值 由于太多就不先初始化
    //思路如下
    int b,c;
    for(int i=0;i<100;i++)
      if(a[i]!=i)
        b=a[i];//给b赋值 当a[i]!=i的情况下 也就是a数组的下标不等于其储存的值-1
    while (1)
    {
        if(b!=a[b-1])//判断b插入的位置不等于其本身 如果相等则为结果
        {//将b插入到对应数组的下标位置 也就是对其进行插入排序
            //由于是 1-99的数字那么只需要进行最大99次交换 算法为n
            c=a[b-1];
            a[b-1]=b;
            b=c;
        }
        else
            break;
        
    }
    printf("%d",b);
}
2010-05-01 18:29
kingsroot
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:284
专家分:1159
注 册:2010-3-28
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>

int main( void )
{
    int temp;
    int array[100];//假设已经赋值了
   
    int Number = 0;
   
    for( temp = 0; temp <= 99; temp++ )
    {
         Number = Number + array[temp];//对这100个数求和
    }
   
    printf( "相同的数为:%d", Number % 4950 );
    return 0;
}
你把你第一题的算法复杂度给出来看下  如果比我高 我就懒得贴了 嘿嘿
2010-05-01 18:38
kingsroot
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:284
专家分:1159
注 册:2010-3-28
收藏
得分:0 
说错了  比我低  ~~~~
2010-05-01 18:38
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:0 
int main()
{ //因为其为1-99的数字 而且只有一个重复
    int a[100];//请赋值 由于太多就不先初始化
    //思路如下
    int b,c;
    a[0]=8;//重复数字
    for(int i=99;i>0;i--)
    {
        a[i]=i;//1-99的数字
    }
    for(int i=0;i<100;i++)
      if(a[i]!=i)
        b=a[i];//给b赋值 当a[i]!=i的情况下 也就是a数组的下标不等于其储存的值-1
    while (1)
    {  
        if(b!=a[b-1])//判断b插入的位置不等于其本身 如果相等则为结果
        {//将b插入到对应数组的下标位置 也就是对其进行插入排序
            //由于是 1-99的数字那么只需要进行最大99次交换 算法为n
            c=a[b-1];
            a[b-1]=b;
            b=c;
        }
        else
            break;
        
    }
    printf("%d",b);
}

验证了下 可以通过 得出结果
2010-05-01 18:40
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:0 
2.有个数组arr[100]存放了100个数,这100个数取自1-99,且只有两个相同的数,剩下的98个数不同,写一个搜索算法找出相同的那个数的值.(注意空间效率时间效率尽可能要低).

你题目没记错吗?  仔细看了下 1-99个 总共才99个数  
两个相同的数字 说明1-99全部取了 然后剩下的一个再从1-99 中取
那么数组的和减去 (1+99)*99/2 = 不就是相同的么
2010-05-01 18:47
快速回复:两道面试题的解答,找工作的兄弟看过来~~~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.055876 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved