从别处看到的一道算法附加题
2012-05-11 17:58
309 查看
题目:已知一个数组a
,构造一个数组b
,构造规则:b[i]=a[0]*a[1]*a[2]...a
/a[i];
要求:
1、不可以使用除法;
2、时间复杂度为O(n),空间复杂度为S(0);
3、除遍历使用的变量外,不可以使用其它变量;
自己的解法虽然不合题意,终究是自己想的,但是极力只用1个.可以使用遍历变量我就无耻的把他当作遍历变量吧,空间复杂度就无法满足了使用递归的话.......
思路很简单:递归到最后一个元素过程中边计算之前的数字乘法积,然后记录后面元素乘积和.
//r1 :用来记录index后的元素乘积
//r2 :index之前的元素的乘积
//index:当前所处的元素的索引号
static void Fun(int[] a, int[] b, int index, ref int r1, int r2)
个人觉得解法比较精炼,所以贴出来,给自己做个记录.
1 class Program
2 {
3 static void Fun(int[] a, int[] b, int index, ref int r1, int r2)
4 {
5 if (index == b.Length - 1)
6 {
7 b[index] = r2;
8 r1 = a[index];
9 return ;
10 }
11 r1 = 1;
12 Fun(a, b, index + 1,ref r1, r2 * a[index]);
13 b[index] = r2 * r1;
14 r1 = a[index] * r1;
15 }
16
17
18
19 static void Main(string[] args)
20 {
21 int[] a = new int[11];
22 int[] b = new int[a.Length];
23 int total = 1;
24 for (int i = 0; i < a.Length; i++)
25 {
26 a[i] = i + 1;
27 total *= (i + 1);
28 }
29 //Console.WriteLine(total);
30 int r1 = 1;
31 int r2 = 1;
32 Fun(a, b, 0, ref r1, r2);
33 for (int i = 0; i < b.Length; i++)
34 {
35 Console.WriteLine(b[i] + "=" + total / a[i]);
36 }
37 Console.ReadLine();
38 }
39
40
41 }
,构造一个数组b
,构造规则:b[i]=a[0]*a[1]*a[2]...a
/a[i];
要求:
1、不可以使用除法;
2、时间复杂度为O(n),空间复杂度为S(0);
3、除遍历使用的变量外,不可以使用其它变量;
自己的解法虽然不合题意,终究是自己想的,但是极力只用1个.可以使用遍历变量我就无耻的把他当作遍历变量吧,空间复杂度就无法满足了使用递归的话.......
思路很简单:递归到最后一个元素过程中边计算之前的数字乘法积,然后记录后面元素乘积和.
//r1 :用来记录index后的元素乘积
//r2 :index之前的元素的乘积
//index:当前所处的元素的索引号
static void Fun(int[] a, int[] b, int index, ref int r1, int r2)
个人觉得解法比较精炼,所以贴出来,给自己做个记录.
1 class Program
2 {
3 static void Fun(int[] a, int[] b, int index, ref int r1, int r2)
4 {
5 if (index == b.Length - 1)
6 {
7 b[index] = r2;
8 r1 = a[index];
9 return ;
10 }
11 r1 = 1;
12 Fun(a, b, index + 1,ref r1, r2 * a[index]);
13 b[index] = r2 * r1;
14 r1 = a[index] * r1;
15 }
16
17
18
19 static void Main(string[] args)
20 {
21 int[] a = new int[11];
22 int[] b = new int[a.Length];
23 int total = 1;
24 for (int i = 0; i < a.Length; i++)
25 {
26 a[i] = i + 1;
27 total *= (i + 1);
28 }
29 //Console.WriteLine(total);
30 int r1 = 1;
31 int r2 = 1;
32 Fun(a, b, 0, ref r1, r2);
33 for (int i = 0; i < b.Length; i++)
34 {
35 Console.WriteLine(b[i] + "=" + total / a[i]);
36 }
37 Console.ReadLine();
38 }
39
40
41 }
相关文章推荐
- [CSDN]首页看到的一道算法题
- 【水笔】多年前看到的一道算法题,留念
- 白天看到的一道算法题目,应该是平衡二叉树方面的
- 一道有趣的数字算法题
- 在ICCAVR中通过使用库函数来避免直接看到敏感算法源码
- 打印两个有序链表的公共部分(每日一道算法题)
- 【原创】一道算法题
- 删除链表的倒数第K个节点(每日一道算法题)
- ZOJ 1312 题解这是一道简单题但容易出错,不需要使用任和算法就可做出来,而且很快。我的AC 0ms
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- java将一个正整数分解质因数(每天一道算法题)
- 阿里巴巴一道算法题
- 阿里巴巴2014校园招聘研发笔试一道JAVA附加题分析
- 《github一天一道算法题》:堆算法接口实现(堆排序、堆插入和堆取最值并删除)
- 一道词典算法题,讲单词隐射为词典中的顺序
- 问一道算法题:算出这些直线一共有多少个交点
- 每天一道算法题5 判断整数序列是不是二元查找树的后序遍历结果
- 【每日一道算法题】
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 【每日一道算法题】