`
java-mans
  • 浏览: 11741875 次
文章分类
社区版块
存档分类
最新评论

【100题】第四十五题 雅虎面试两道题(矩阵判断、数组划分)

 
阅读更多

一,对于一个整数对于一个整数矩阵矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。

分析:对任意一个位置,他的值不大于周围(上下左右)4个临格的数值的和,如果大于则该矩阵不能由全零矩阵得到

解法一:可能是我能想到的最复杂的方法

1)将二维数组根据行优先原则,变为一维数组。

2)然后对一维数组进行排序,取不为零的值,将元素对应的值拆分成对应个数该元素,然后全排列。这样得到所有可能的矩阵元素递减策略。例如A[0][0] = 3则对应A[0]拆分成3个A[0]

3)对上述排列逐一判断

1>如果相邻元素在二维数组中不“相邻”则排除

2>如果同一个元素相邻则排除

3>遍历到某个排列时,正好遍历完则返回正确

如果遍历完整个全排列,也没有得到正确结果,则说明不能由全零矩阵得到整形 矩阵 解法二:优化解法一

1)先扫描整个二维数组,如果某个元素值大于其周围元素值和,则返回错误

2)然后利用动态规划,递归的思路。

自己写的递归算法,不知有无错误。敬请斧正!!!谢谢!!!

#include <iostream>
using  namespace std;
#define cols 2
#define rows  2
int test(int a[][cols])
{
	int n=0;
	for(int i=0;i<cols;++i)
	{
		for(int j=0;j<rows;++j)
		{
			if(a[i][j]==0)
			    ++n;
		}
	}
	if(n==cols*rows)
	{
		//cout<<""<<endl;
		return 1;
	} 
	
}
int aroundTest(int a[][cols],int i,int j)
{
	int flag=0;
            	if((i-1>=0)&&(j-1>=0)&&(a[i-1][j-1]>0))
				{
					flag=1;
					a[i-1][j-1]--;
					if(test(a)==1)
					   return 1;
					aroundTest(a,i-1,j-1);
					a[i-1][j-1]++;
				}	
				if((i-1>=0)&&(a[i-1][j]>0))
				{
					flag=1;
					a[i-1][j]--;
					if(test(a)==1)
					   return 1;
					aroundTest(a,i-1,j);
					a[i-1][j]++;
				}	
				if((i-1>=0)&&(a[i-1][j+1]>0))
				{
					flag=1;
					a[i-1][j+1]--;
					if(test(a)==1)
					   return 1;
					aroundTest(a,i-1,j+1);
					a[i-1][j+1]++;
				}	
				if((j-1>=0)&&(a[i][j-1]>0))
				{
					flag=1;
					a[i][j-1]--;
					if(test(a)==1)
					   return 1;
					aroundTest(a,i,j-1);
					a[i][j-1]++;
				}	
				if((a[i][j+1]>0))
				{
					flag=1;
					a[i][j+1]--;
					if(test(a)==1)
					   return 1;
					aroundTest(a,i,j+1);
					a[i][j+1]++;
				}	
				if((a[i+1][j-1]>0))
				{
					flag=1;
					a[i+1][j-1]--;
					if(test(a)==1)
					   return 1;
					aroundTest(a,i+1,j-1);
					a[i+1][j-1]++;
				}	
				if((a[i][j+1]>0))
				{
					flag=1;
					a[i][j+1]--;
					if(test(a)==1)
					   return 1;
					aroundTest(a,i,j+1);
					a[i][j+1]++;
				}	
				if((a[i+1][j+1]>0))
				{
					flag=1;
					a[i+1][j+1]--;
					if(test(a)==1)
					   return 1;
					aroundTest(a,i+1,j+1);
					a[i+1][j+1]++;
				}	
				
	if(flag==0)
		return 0;	
}
void distiguish(int a[][cols])//i为行,n为每行元素个数 
{
	int result;
	for(int i=0;i<cols;i++)
	{
		for(int j=0;j<rows;j++)
		{
			if(a[i][j]<0)
			{
				cout<<"False"<<endl;
				return; 
			}
			else if(a[i][j]>0)
			{
				a[i][j]--;
				result=aroundTest(a,i,j);
				if(result==1)
				{
					cout<<"YES"<<endl;
					return; 
				}
				else
				{
					cout<<"NO"<<endl;
					return; 
				}
				
			}
			else if(a[i][j] == 0)
			{
				if(test(a) == 1)
			    {
				  cout<<"YES"<<endl;
				  return; 
 				} 
			  
			}
		}
	}
	
}

int main()
{
	int a[][2]={{0,1},{1,1}};
	distiguish(a);
	
}

附:退出单重循环用break;

退出双重或多重循环用return;



二,一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
比如{32436}可以分成{32436} m=1;
{3,6} {2,4,3} m=2
{3,3} {2,4} {6} m=3

所以m的最大值为3

分析:1)如果所有值的和sum(a[0]-a[n])/m != 0则直接退出

如果数组最大值>sum/m 则m不能再增加了

2)主要用的思想为,深度优先遍历,优化用剪枝法。

对于 递归算法 bool dfs(int res,int cpl,int level)

res为当前要凑齐长度的数组中,已经添加元素后的长度

cpl 为已经添加好的组数

每次先判断当前数组是否已经符合分组条件,符合则cpl+1

添加某个未使用的元素有三种情况

1>添加后等于分组后每组大小 这时试着添加后,进行递归。如果最终返回true则成功,否则,不能添加本元素到当前小组

2>添加后小于分组后大小 ,也试着添加,然后同上

3>添加后大于分组后大小,则舍弃

如果全程没有返回一个ture则该分组不正确


代码:

#include<iostream>
#include<algorithm>
using namespace std;
int n;              //小棒总数
int len;            //当前枚举的原棒长度
int parts;          //当前组合的原棒数
int max;            //最长小棒的长度
int sum;            //所有小棒的总长
int a[100];       //存储小棒相关信息
bool used[100];      //标记小棒是否使用

bool pt(int a,int b)
{
 	return a>b;
}
//res 为每组长度和  cpl 为组数 
bool dfs(int res,int cpl,int level)//res:当前已组合进去的木棒的长度      cpl:组合进去的小木棒的条数
{
    int i;
    if(res==len)//本组够长 
    {
        res = 0;
        cpl++;
    }
    if(cpl == parts)//组数已够 
        return true;
        
    for(i=level;i<n;i++)
    {
        if(i && !used[i-1] && a[i]==a[i-1])
			continue;
        if(used[i]==0)//该棒没有用 
        {
            if(res + a[i] <len) //如果添加该棒 没有超过长度则添加之 
            {
                used[i] = true;
                if(dfs(res+a[i],cpl,i+1)) //添加后测试其余 
					return true;
                used[i] = false;//说明上述添加失败 
            }
            else if(res+a[i]==len)//添加后刚好相等 
            {
                used[i] = true;
                if(dfs(0,cpl+1,0))//进行剩下数组的划分 
					return true;
                used[i] = false; //走到这里说明,上述失败需要回溯 
            }
            if(res==0) 
				break;
        }
        
        
    }
    return false;    
}
int main()
{
    int i;

    n=5; //元素个数 
    //int b[]={4,4,4,4};
    int b[]={3,2,4,3,6};
    
    for(int j=0;j<n;++j)//初始化数组 
          a[j]=b[j];
	

        sum=0;
        for(i=0;i<n;i++)
		{
            sum+=a[i];
            used[i]=false;
        }
        sort(a,a+n,pt);//从大到小排序
		 
	    int m=1;
	    int max=1;
   
	    
	    for(m=2;m<=n;m++)
	    {
	    	 for(i=0;i<n;i++)
			{
            
            		used[i]=false;
		    }
        
    		if(sum%m==0)//可以整除 
    		{
    			  
		    	len=sum/m;
		    	parts=m;
	    	
       		   if(dfs(0,1,0))
        		{
            		//printf("yes\n");
            		max=m;
   				}
  			 
			
		    }
    		
    	}
    	cout<<max<<endl;
    
  return 0;
}








分享到:
评论

相关推荐

    ASP.NET整理过的面试题集锦

    ASP.NET整理过的面试题集锦 ASP.NET整理过的面试题集锦 16个经典面试问题回答思路.txt ASP代码题.doc ASP问答题.doc c#选择题.txt C#面试题.doc Interview.doc SQL面试题.doc 博彦考题.doc 外 企 面 试 技 巧.doc ...

    .net 面试题系列(网上收集)很全

    2008/06/17 18:41 2,804 .net 面试题系列四(附答案).txt 2008/06/17 18:43 1,397 .net 面试题系列文章一(附答案).txt 2008/06/17 18:42 4,165 .net 面试题系列文章三(附答案).txt 2008/06/17 18:36 4,925 .net...

    C++ 笔试题 google 微软 华为 索尼 中兴 大唐 各种C++笔试题目

    16道C语言面试题例子 死循环(Infinite loops) 数据声明(Data declarations) 位操作(Bit manipulation) 访问固定的内存位置(Accessing fixed memory locations) 中断(Interrupts) 代码例子(Code examples...

    我在雅虎的面试经历

    快速排序是一种基础但重要的算法,它基于分治法,通过选取一个基准值将数组分为两部分,然后对这两部分分别进行排序。虽然面试者记起了大致思路,但在实际编写过程中表现不佳,这提醒我们,即使是基础算法,也需要...

    IT互联网各个公司面试真题与面经资料32个合集.zip

    【2013-15年腾讯校园招聘】腾讯产品策划类笔试面试题整理.pdf 【2013-2015年迅雷校园招聘】迅雷近年产品经理笔试题汇总.pdf 【2014年百度校园招聘】百度客户端产品设计师___产品经理___一面面经.pdf 【2014年谷歌...

    BAT华为美团360谷歌等各大互联网公司软件校招面试笔试试题资料240MB合集.zip

    【2013-15年腾讯校园招聘】腾讯产品策划类笔试面试题整理.pdf 【2014年百度校园招聘】百度客户端产品设计师___产品经理___一面面经.pdf 【2014年谷歌校园招聘】腾讯产品笔试策划+经验.pdf 【2014腾讯校园招聘】腾讯...

    雅虎公司C#笔试题雅虎公司C#笔试题

    - **题目含义**:此题未提供足够的信息来判断具体的考点。 - **解析**:此题可能考察的是C#语言中的某个概念或特性,但由于题干信息缺失,无法给出具体答案。 2. **选择题2**: - **题目含义**:询问关于数据...

    php-面试题之雅虎.pdf

    【PHP面试题解析】 1. 哪个不会将'john'添加到users数组中? - 选项1 `$users[] = 'john';` 是正确的添加方式。 - 选项2 `array_add($users,'john');` 不是PHP内置函数。 - 选项3 `array_push($users,'john');` ...

    2016奇虎360_JAVA研发工程师内推笔试题.zip_java interview_java 面试 雅虎 360

    标签“java_interview java_面试_雅虎_360”表明这个压缩包里的内容主要涉及Java语言的面试问题,但同样,雅虎(Yahoo)的提及可能是个误解。我们将重点关注360公司的Java面试要求。 从压缩包中唯一的文件“2016...

    asp.net面试题三套

    文件名中的“雅虎C#面试题.doc”、“asp.net面试题.doc”和“C#面试题.doc”表明面试题可能涵盖C#语言和ASP.NET的各个方面,所以候选人应该对这两个领域都有深入的了解。准备面试时,不仅要熟记理论,还要有实践经验...

    雅虎公司C#笔试题,包括问答题和选择题两部分

    根据给定的雅虎公司C#笔试题目,我们可以从中提炼出一系列重要的IT知识点,主要涉及C#编程语言、计算机网络、数据库系统等多个方面。下面将对这些知识点进行详细阐述。 ### 1. C#基本概念 #### Question1:C#中的...

    08年雅虎计算机基础知识笔试题

    ### 雅虎2008年计算机基础知识笔试题解析 #### Question 1: 选择题 问题:在以下选项中,哪一项表示2? 1. 1.2.3.4 2. 1.2.3.4 3. 1.2.3.4 4. 1.2.3.4 **知识点:** 本题考查对数字识别的基本能力。选择题通常要求...

    IT公司笔面试题集合

    《IT公司笔面试题集合》是一份集合了众多知名IT企业招聘过程中常见的笔试和面试题目的资源库。这份资料涵盖了微软(MS)、谷歌(Google)、百度、雅虎(Yahoo!)、华为等业内巨头的各类题目,旨在帮助求职者在应聘过程中...

    计算机 IT 软件 经典 笔试面试题集

    这份《计算机 IT 软件 经典 笔试面试题集》汇集了多家知名企业的笔试面试题目,涉及的公司包括微软、百度、腾讯、雅虎、联想以及网易等,这为准备IT行业求职的候选人提供了一套全面的练习材料。在这些题目中,我们...

    雅虎中国——招聘试题

    《雅虎中国——招聘试题解析》 在信息技术领域,雅虎中国作为一家知名的互联网公司,其招聘过程自然备受瞩目。本篇文章将深入探讨雅虎中国招聘试题中的关键知识点,帮助求职者更好地准备在线考试,提升自己的竞争力...

    IT类 各类 大中小 公司 面试 笔试题 java c c++

    在IT行业中,面试是评估求职者技能和适应性的重要环节,尤其对于编程语言如Java、C和C++的开发者来说,面试通常...通过这份压缩包中的各大公司面试题,求职者可以有针对性地进行复习和模拟训练,以提高面试成功的机会。

    雅虎笔试题

    从给定的文件标题“雅虎笔试题”和部分题目内容来看,这是一份涵盖计算机科学与技术领域多个方面的笔试题集,旨在测试应聘者在IT领域的知识掌握程度。下面,我们将对部分题目进行详细的知识点解读。 ### 题目解析 ...

    雅虎公司C#笔试题.pdf

    ### 雅虎公司C#笔试题知识点解析 #### 知识点一:计算机网络可靠性指标(Question1) - **知识点概述**:本题考察了计算机网络中衡量数据传输可靠性的关键指标。 - **详细解释**: - **传输率**:指单位时间内通过...

Global site tag (gtag.js) - Google Analytics