微软100题(45)几道雅虎面试题
2015-05-31 11:57
344 查看
题目:
1.对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)
某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。
2.一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;
{3,6}{2,4,3} m=2
{3,3}{2,4}{6} m=3 所以m的最大值为3
1.给出一种思路: http://m.blog.csdn.net/blog/crasyangel/11138243
对矩阵中任何一个节点O,找到其所有的邻近节点A,B..并相加得到和sum,用sum-节点A的值,得到一个新值O1。再找所有和AB..邻近的(已经出现的不再加)之和,减去O1,又得到一个新值O2,重复该过程,直到O2值等于0或小于0。若小于0,则不可能。
若所有的节点经过该运算等于0则可以。
构造的过程如下:找到矩阵中最小的元素,找到相邻最小的同时减去最小值,重复该过程,就可以减到0。
例如: 矩阵 1 2
3 4
首先对于第一行第一列元素1,,它的相邻元素和为2+3=5,将5-1得到4;元素2和3的相邻元素为4(1已出现),而4-4=0,元素1满足要求。同理求解元素2、3、4,同样可得到最后的结果都为0,故此矩阵可由一个全零矩阵实现。
2.思路:
参考http://blog.csdn.net/peng_weida/article/details/7741888
是个01背包问题,递归回溯
初始值m从n开始,依次递减测试;数组的和为sum,若sum%m的值不为0,则直接跳过
对于符合sum%m = 0的每个m,扫描数组中每个元素,若该元素的状态为未选,将其分配到相应组
(1) 若当前组元素的和大于 sum/m,表明当前元素不适合该组,将其状态(aux[i])置为0
(2) 若当前组元素的和等于 sum/m, 将组号加1,继续进行下一组的判断
(3) 若当前组元素的和小于 sum/m,将当前加入的元素置为已选状态(aux[i]的值设为当前组号),继续判断下一个元素加入加入当前组的情况
1.对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)
某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。
2.一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;
{3,6}{2,4,3} m=2
{3,3}{2,4}{6} m=3 所以m的最大值为3
1.给出一种思路: http://m.blog.csdn.net/blog/crasyangel/11138243
对矩阵中任何一个节点O,找到其所有的邻近节点A,B..并相加得到和sum,用sum-节点A的值,得到一个新值O1。再找所有和AB..邻近的(已经出现的不再加)之和,减去O1,又得到一个新值O2,重复该过程,直到O2值等于0或小于0。若小于0,则不可能。
若所有的节点经过该运算等于0则可以。
构造的过程如下:找到矩阵中最小的元素,找到相邻最小的同时减去最小值,重复该过程,就可以减到0。
例如: 矩阵 1 2
3 4
首先对于第一行第一列元素1,,它的相邻元素和为2+3=5,将5-1得到4;元素2和3的相邻元素为4(1已出现),而4-4=0,元素1满足要求。同理求解元素2、3、4,同样可得到最后的结果都为0,故此矩阵可由一个全零矩阵实现。
2.思路:
参考http://blog.csdn.net/peng_weida/article/details/7741888
是个01背包问题,递归回溯
初始值m从n开始,依次递减测试;数组的和为sum,若sum%m的值不为0,则直接跳过
对于符合sum%m = 0的每个m,扫描数组中每个元素,若该元素的状态为未选,将其分配到相应组
(1) 若当前组元素的和大于 sum/m,表明当前元素不适合该组,将其状态(aux[i])置为0
(2) 若当前组元素的和等于 sum/m, 将组号加1,继续进行下一组的判断
(3) 若当前组元素的和小于 sum/m,将当前加入的元素置为已选状态(aux[i]的值设为当前组号),继续判断下一个元素加入加入当前组的情况
int maxShares(int a[], int n); //aux[i]的值表示数组a中第i个元素分在哪个组,值为0表示未分配 //当前处理的组的现有和 + goal的值 = groupsum int testShares(int a[], int n, int m, int sum, int groupsum, int aux[], int goal, int groupId); int main() { int a[] = {2, 9, 4, 1, 3, 9, 7, 5, 8, 10}; //打印数组值 printf("数组的值:"); for (int i = 0; i < NUM; i++) printf(" %d ", a[i]); printf("\n可以分配的最大组数为:%d\n", maxShares(a, NUM)); system("pause"); return 0; } int testShares(int a[], int n, int m, int sum, int groupsum, int aux[], int goal, int groupId) { if (goal < 0) return 0; if (goal == 0) { groupId++; goal = groupsum; if (groupId == m+1) return 1; } for (int i = 0; i < n; i++) { if (aux[i] != 0) continue; aux[i] = groupId; if (testShares(a, n, m, sum, groupsum, aux, goal-a[i], groupId)) return 1; aux[i] = 0; //a[i]分配失败,将其置为未分配状态 } return 0; } int maxShares(int a[], int n) { int sum = 0; int *aux = (int *)malloc(sizeof(int) * n); for (int i = 0; i < n; i++) sum += a[i]; for (int m = n; m >= 2; m--) { if (sum%m != 0) continue; for (int i = 0; i < n; i++) aux[i] = 0; if (testShares(a, n, m, sum, sum/m, aux, sum/m, 1)) { //打印分组情况 printf("\n分组情况:"); for (int i = 0; i < NUM; i++) printf(" %d ", aux[i]); free(aux); aux = NULL; return m; } } free(aux); aux = NULL; return 1; }
相关文章推荐
- 微软100题(44)几道腾讯面试题
- 面试题22:栈的压入弹出序列
- 个人发展(职业规划)
- 面试题21:包含min函数的栈
- 面试题之final,finally和finalize的区别以及如果catch里面有return语句,请问finally里面的代码还会执行吗?
- 求职-如何伪装一份cs的简历
- [程序员短壁纸]2015年05月
- 黑马程序员——java面向对象-继承
- 黑马程序员——内部类
- 黑马程序员——OC 基础:实例变量修饰符,description方法和多态
- 面试题:将一个数用二进制打印输出…
- Andorid工程师的职业生涯
- 【黑马程序员】----java基础---面向对象
- 程序员的工作环境与效率
- 国外程序员整理的机器学习资源大全
- 黑马程序员---装饰类设计模式
- 为什么程序员不擅长估算时间
- 黑马程序员——String类,包装类及List,Set集合
- 2015年阿里面试题——多线程(生产者消费者模型)
- 年轻程序员需要学习的5大经验