阿里巴巴暑假算法面试题

bellinctbu 2014-07-20 10:04:05
有N个数组 依此按行排列 类似矩阵但是每个数组元素却不等
要求 输出所有数组的所有元素 而且 第一个数组输出1次
其他的数组输出M次 而且M等于该数组前一个数组的元素个数
请用尽量简单的算法实现 并分析其时间复杂度
...全文
594 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
nadleeh 2014-07-21
  • 打赏
  • 举报
回复
引用 楼主 bellinctbu 的回复:
有N个数组 依此按行排列 类似矩阵但是每个数组元素却不等 要求 输出所有数组的所有元素 而且 第一个数组输出1次 其他的数组输出M次 而且M等于该数组前一个数组的元素个数 请用尽量简单的算法实现 并分析其时间复杂度
这种题目太模糊了,N=100和N=2^100,处理上肯定会有区别的,当你的数据大的需要几十块硬盘才放的下的时候,和只需要100MB的的内存空间就能放下,就算是同样的规律的数据,处理起来也绝对不一样。 没有特定的有逻辑范围的给定数据,我个人认为谈不上算法,算法不是空想,而是服务与数据的算法才有价值。 个人建议遇到这些类型不要去局限表面,要多发散思维。
勤奋的小游侠 2014-07-20
  • 打赏
  • 举报
回复
每个数组的元素不等,那怎么确定第一个数组有多少个元素?这个数组下标保存在哪里?如果已经知道每个数组的下标,将它们相加不好好了吗
「已注销」 2014-07-20
  • 打赏
  • 举报
回复
引用 8 楼 truexf 的回复:
[quote=引用 7 楼 bellinctbu 的回复:] 题目说错了,应该是 其他的数组输出M次 而且M等于该数组前面所有数组的元素个数之和
那就把while(true)前面的那句iCount=0;注释掉[/quote] 不对的,纠正一下:
void printArray(char *arrs[],size_t iRowCount)
{    
    int iRepeat;
    int iCount = 0;
    for(size_t i=0; i<iRowCount; ++i )
    {
        if(0==i)        
            iRepeat = 1;
        else
            iRepeat += iCount;
        for(int j=0;j<iRepeat;++j)
        {        
            iCount = 0;
            while(true)
            {
                if('\0' == arrs[i][iCount])
                {
                    printf("\r\n");
                    break;
                }
                else
                {
                    printf("%c",arrs[i][iCount]);
                    ++iCount;
                }
            }
        }
    }
}
「已注销」 2014-07-20
  • 打赏
  • 举报
回复
引用 7 楼 bellinctbu 的回复:
题目说错了,应该是 其他的数组输出M次 而且M等于该数组前面所有数组的元素个数之和
那就把while(true)前面的那句iCount=0;注释掉
bellinctbu 2014-07-20
  • 打赏
  • 举报
回复
引用 3 楼 truexf 的回复:

void printArray(char *arrs[],size_t iRowCount)
{    
    int iRepeat;
    int iCount = 0;
    for(size_t i=0; i<iRowCount; ++i )
    {
        if(0==i)        
            iRepeat = 1;
        else
            iRepeat = iCount;
        for(int j=0;j<iRepeat;++j)
        {        
            iCount = 0;
            while(true)
            {
                if('\0' == arrs[i][iCount])
                {
                    printf("\r\n");
                    break;
                }
                else
                {
                    printf("%c",arrs[i][iCount]);
                    ++iCount;
                }
            }
        }
    }
}

int _tmain(int argc, _TCHAR* argv[])
{

    char* arrs[] ={"i love you china","hello world","oh yeah, come on baby!"};
    printArray(arrs,3);
    system("pause");
    return 0;
}
题目说错了,应该是 其他的数组输出M次 而且M等于该数组前面所有数组的元素个数之和
bellinctbu 2014-07-20
  • 打赏
  • 举报
回复
题目说错了,应该是 其他的数组输出M次 而且M等于该数组前面所有数组的元素个数之和
bellinctbu 2014-07-20
  • 打赏
  • 举报
回复
引用 4 楼 FightForProgrammer 的回复:
初步想了一下,一般的算法需要像遍历二维数组那样,结果复杂度是 n^2 现在的想法是把这个数组保存在一个结构体里面

struct {
int index;//保存元素输出次数
int *arr;//保存元素
};
通过memcpy把每个数组元素移到结构体中,然后把每个结构体输出就是了。这样时间复杂度n
这样也有个问题 如何按照他指定的次数输出每一个数组
FightForProgrammer 2014-07-20
  • 打赏
  • 举报
回复
初步想了一下,一般的算法需要像遍历二维数组那样,结果复杂度是 n^2 现在的想法是把这个数组保存在一个结构体里面

struct {
int index;//保存元素输出次数
int *arr;//保存元素
};
通过memcpy把每个数组元素移到结构体中,然后把每个结构体输出就是了。这样时间复杂度n
「已注销」 2014-07-20
  • 打赏
  • 举报
回复

void printArray(char *arrs[],size_t iRowCount)
{    
    int iRepeat;
    int iCount = 0;
    for(size_t i=0; i<iRowCount; ++i )
    {
        if(0==i)        
            iRepeat = 1;
        else
            iRepeat = iCount;
        for(int j=0;j<iRepeat;++j)
        {        
            iCount = 0;
            while(true)
            {
                if('\0' == arrs[i][iCount])
                {
                    printf("\r\n");
                    break;
                }
                else
                {
                    printf("%c",arrs[i][iCount]);
                    ++iCount;
                }
            }
        }
    }
}

int _tmain(int argc, _TCHAR* argv[])
{

    char* arrs[] ={"i love you china","hello world","oh yeah, come on baby!"};
    printArray(arrs,3);
    system("pause");
    return 0;
}
William张 2014-07-20
  • 打赏
  • 举报
回复
新手路过,坐等简单算法。
bellinctbu 2014-07-20
  • 打赏
  • 举报
回复
关键在于尽量简单的算法复杂度。。。
707wk 2014-07-20
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#include <string.h>

void printArray(char *arrs[],int num)
{    
    int len=1;
    int i;
    for(;num>0 ;)
    {
	    num--;
	    for(i=0;i<len;i++)
	    {
		    puts(*arrs);
	    }
	    if(num>0)arrs++;
	    len=len+strlen(*arrs)+1;
    }
}
 
int main(int argc, char* argv[])
{ 
    char* arrs[] ={"i love you china","hello world","oh yeah, come on baby!"};
    printArray(arrs,3);
    return 0;
}
lucifer886 2014-07-20
  • 打赏
  • 举报
回复
总感觉很多朋友贴上来的这些公司算法题说的模模糊糊的……是我水平太臭了还是楼主都按照自己的记忆翻译了一边……原题目应该不会是这样说明的吧……

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧