| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6505 人关注过本帖
标题:腾讯的一道面试题??欢迎讨论
只看楼主 加入收藏
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
可以做排序用,不过空间要足够大

小代码,大智慧
2011-01-10 22:54
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
好几个ID一开始看起来感觉挺吓唬人的. 几个帖子一回. 唉,tragedy~

我就是真命天子,顺我者生,逆我者死!
2011-01-10 23:36
__c__
Rank: 1
等 级:等待验证会员
帖 子:4
专家分:1
注 册:2011-1-9
收藏
得分:1 
2楼的方法好.按2楼的方法的一种实现
 
程序代码:
int
is_match (const char *s1, const char *s2)
{
  signed int *pi;
  /* count用来记录各个字符的个数,是s1中的字符则加1,s2中的字符则减1.
   * 如果匹配成功,那么各个字符的数目应该是0。对于普通字符而言,只要
   * 数组有128个元素就可以了,分配129个元素并把第129个元素count[128]
   * 初始化为-1,这个元素起着哨兵的作用,在检查各个元素的数目是不是
   * 为0的时候,可以少一个if条件语句,可以少量提高效率。           */
  signed int count[129] = { [128]=-1 };

 
  for ( ; ; )
    {
    /*  */
    ++ count[ (int)(*s1) ];
    -- count[ (int)(*s2) ];
    ++ s1,  ++ s2;

 
    /* 使用&位运算 是为了尽可能的避免 && || if ?: 等语句引起的分支
     * 预测而降低效率 。
     * (*s1!=0) & (*s2!=0) 为1(真)时,表示s1和s2都没有到达字符串尾部。
     * (*s1==0) & (*s2==0) 为1(真)时, 表示s1和s2都刚好到达字符串尾部,
     *   这种情况表示s1和s2的长度是一样长,则退出循环, 进入下一步检验。
     * 如果上面2个if语句都不满足,则s1和s2的长度不一样,返回不匹配。  */
    if ((*s1!=0) & (*s2!=0)) continue;
    if ((*s1==0) & (*s2==0)) break;
    return 0;
    }
   
  /* 如果count数组的某个元素不为0,则退出for循环。当然这绝不会是死循环。
   * 不管s1和s2是不是能匹配,count[128]一定不为0(count[128]==-1)。
   * 如果s1和s2能匹配, 那么 pi 一定是因为指向了count[128]而退出了循环。
   * 也可以这样说,如果 pi没有因指向了count[128]而退出了循环, 则不匹配。
   * 这样 count[128]这个元素起到了哨兵的作用,这样可以少一个if 语句。   */
  for (pi = count; *++pi == 0; ) { }

  /* 如果pi指向了 count[128](等价于pi-count==128)
   * 那么返回匹配成功;             否则失败。    */
  return ((unsigned int)(pi - count) == 128);
}

这段代码不能处理空字符串。
如果s1和s2有一个是"\0" 则会出错。


[ 本帖最后由 __c__ 于 2011-1-11 16:38 编辑 ]
2011-01-10 23:39
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
马后炮, 这么俗的 ID,没想是韬光养晦, 深藏不露... 由衷的佩服, 真乃神人也/

我就是真命天子,顺我者生,逆我者死!
2011-01-10 23:42
马后炮
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:156
专家分:560
注 册:2010-12-17
收藏
得分:0 
请问,33楼的是Devil_W吗?

樱之雪,晓之车
2011-01-10 23:45
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用马后炮在2011-1-10 23:45:13的发言:

请问,33楼的是Devil_W吗?



哥从不用马甲。。。
2011-01-11 00:09
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:1 
马后炮==事后诸葛亮

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2011-01-11 00:10
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
程序代码:
char FirstNotRepeatingChar(char* pString,char *nString)
{
      // invalid input
      if(!pString|!nString)
            return 0;

      // get a hash table, and initialize it
      const int tableSize = 256;
      unsigned int hashTable[tableSize];
      for(unsigned int i = 0; i < tableSize; ++ i)
            hashTable[i] = 1;

      // get the how many times each char appears in the string
      char* pHashKey = pString,* nHashKey = nString;
      while(*(pHashKey) != '\0')
            hashTable[*(pHashKey++)] *=2;   //将它们区别
      while(*(nHashKey) != '\0')
            hashTable[*(nHashKey++)] *=3;

      if(pHashKey - pString!=nHashKey - nString)   //如果个数不相等返回
               return 0;
       int np=0;
      for( i = 0; i < tableSize; ++ i)             //它们一双配对
            if(!(hashTable[i]%6)&&hashTable[i]/2==hashTable[i]/3)
                    np++;    
            
         if(np==pHashKey - pHashKey)
            return 1;
         return 0;
}



[ 本帖最后由 点线面 于 2011-1-11 01:01 编辑 ]

小代码,大智慧
2011-01-11 00:55
whliguangh
Rank: 1
等 级:新手上路
帖 子:3
专家分:1
注 册:2011-1-10
收藏
得分:1 
学习了
2011-01-11 12:17
huangapple
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:545
专家分:1790
注 册:2010-12-30
收藏
得分:0 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void sort(char *str,int n)//对数组进行排序
{
    char c;
    int i,j;
    for (j = 0;j <n; ++j)//冒泡。。。
    {
        for(i = 0; i < n - j; ++i)
        {
            if(str[i] > str[i + 1])
            {
                c=str[i];
                str[i] = str[i+1];
                str[i+1] = c;
            }
        }
    }
}
int main()
{   
    char str1[10] = {"asdfghjkl"} , str2[10] = {"lkjhgfdsa"};//一个例子。。楼主如果需要的话可以改成指针的,配上malloc就可以按随意输入大小了
    int i_str1 , i_str2;
    i_str1 = strlen(str1);//求数组长度
    i_str2 = strlen(str2);//求数组长度
    if(i_str1 == i_str2)//数组长度不相同就可能匹配。。
    {
        sort(str1 , i_str1-1);//对数组进行排序
        sort(str2 , i_str2-1);//对数组进行排序
        if(strcmp(str1 , str2))//判断是否相同
            printf("No\n");//输出不匹配
        else
            printf("Yes\n");//输出匹配
    }
    else
        printf("No\n");//输出不匹配
    return 0;
}

这个算法是先排序,再进行判断是否相同。。

[ 本帖最后由 huangapple 于 2011-1-11 12:42 编辑 ]

勤能补拙,熟能生巧!
2011-01-11 12:33
快速回复:腾讯的一道面试题??欢迎讨论
数据加载中...
 
   



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

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