一道搜狗笔试题引发的思考

一: 给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。

在构造过程:

1、不允许使用除法;

2、要求O(1)空间复杂度和O(n)时间复杂度;

3、除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、对空间和全局静态变量等);

void makeArray(int a[],int b[],int len)
{
    int i,j;
    b[0] = 1;  

    for(i=1;i<len;i++)
    {
        b[i] = b[i-1]*a[i-1];   //累乘a[0]*a[1]...a[i-1]
    }  

    b[0] = a[len-1];
    for(j=len-2;j>0;j--)
    {
        b[j] *= b[0];
        b[0] *= a[j];
    }
}

二:学习心得

1  对于这种带要求的(要求苛刻的)问题,就要求我们不能应用常规的方法来思考它;

2  这种题,一般有一些特点,里面的技巧性很强,当然也比较容易发现,从递推公式中可以看出一些端倪;

3  你用常规的方法书写时 再加上 从递推公式中可以看出一些端倪 应该不难看出它的解法

4  平时一定要多多练习,在自己快速地写完一个算法题后,想一想有没有更优的方法,哪怕只有一点点代码优化;

5 代码优化,也是在面试的时候面试官,在你写完代码后,最爱问的一个问题。

时间: 2024-07-28 12:57:48

一道搜狗笔试题引发的思考的相关文章

一道有意思的笔试题引发的对于new操作符的思考

楼主比较喜欢看一些很短但很有意思的题目,无意间又瞥到了一题,大家不妨可以一试.(原题链接猛戳这里) function Fn1() { this.name = 'peter'; return { name: 'jack' }; } function Fn2() { this.name = 'peter'; return 'jack'; } var obj1 = new Fn1(); var obj2 = new Fn2(); console.log(obj1.name, obj2.name); 或

(转)c++类的成员函数存储方式(是否属于类的对象)---一道面试题引发的思考

昨天去面试一家公司,面试题中有一个题,自己没弄清楚,先记录如下: class D { public: void printA() { cout<<"printA"<<endl; } virtual void printB() { cout<<"printB"<<endl; } }; main函数调用: D *d=NULL; d->printA(); d->printB(); 输出结果是? 当时想的是对象d直

一道python面试题引发的血案

这里说的是一道阿里校招的面试题:一行代码实现对列表a中的偶数位置的元素进行加3后求和? 今天去面试同样遇到了这个题目,这道题考察的是对python高阶函数map/filter的灵活运用(具体的使用方法可以参考'廖雪峰的官方网站').作为一个小白的我对高阶函数的运用本就不多,当时连高阶函数的名字都记不清了(书到用时方恨少),妥妥的被虐了个无路可走.无奈记下题目回来求助于度娘了,没想到是阿里的校招题目,网上也给出了答案,但是很明显该答案是存在一些问题的,具体什么问题在这里就不讲了,大家可以自行查找,

前后端交互模型(一个面试题引发的思考总结)

客户端和服务端的交互 面试题: 当用户在地址栏中输入网址,到最后看到页面,中间都经历了什么? (引出前后端交互模型的内容) 客户端 =======> 服务端 (request请求阶段) 服务端 <======= 客户端 (responese响应阶段) 1.URL地址解析 2.DNS域名解析(DNS服务器) 3.和服务器建立TCP连接 (三次握手) 4.把客户端信息传递给服务器(发送HTTP请求) 5.服务器得到并处理请求(HTTP响应内容) 6.客户端渲染服务器返回的内容 7.和服务器端断开T

一道Javascript面试题引发的血案

文章首发于szhshp的第三边境研究所,转载请注明 先来看几道面试题,公司的开发们都尝试做了一下,然而基本没有人能够全部答对. 覆盖的考点很多,也有一些难度,题目挺有意思建议手动执行一边玩玩. Question 1 for (var i = 0; i <5 ; i++) { setTimeout(function(){ console.log(i) ),1000} } console.log(i) Q:这道题目会输出什么? A:这道题目还比较简单,如果对Javascript稍微有一点深入的同学都

由几道JS笔试题引发的知识点探究

1.JS有哪些全局函数? 2.alert('5'+5) 3.cookie.sessionStorage和localStorage的区别 4.call()和apply()方法的区别 5.严格模式和非严格模式有什么区别?严格模式有什么优缺点? 6.JS正则表达式 7.创建一个ul元素添加到body元素中,ul元素包含5个li元素,每个li元素有一个Text类型的子节点 8.sort()方法的应用 9.使用原生JS实现一个可拖拽的DIV 10.用AJAX判断浏览器是IE还是FireFox 11.异步加

由几道JS笔试题引发的知识点探究十五——JS面向对象编程

JS初学者大都没有认识到其强大的面向对象编程的特性,只是把JS当作一门简单实用的脚本语言来用.也正因如此,JS程序员往往处于程序员鄙视链的最低端,很多人觉得JS是HTML一类的语言,甚至连语言都称不上.事实完全不是如此,你若也有这种想法,说明你对JS的认识太浅薄了.要想正真迈入JS的大门,你必须深入了解JS面向对象编程的特性.下面就让我为大家一一道来. 一.创建对象 既然是面向对象,那肯定先得有对象吧,要有对象,肯定得知道对象是什么吧,那JS中的对象是什么呢?在C++里我们知道,对象就是类或结构

一道java笔试题

输入一串用空格隔开的数字串,对于数字串的奇数位按升序排序,偶数位按降序排序. 示例输入: 4 6 2 3 6 7 8 1 处理过程: 奇数位:4 2 6 8 升序排序结果: 2 4 6 8 偶数位:6 3 7 1 降序排序结果: 7 6 3 1 结果输出:2 7 4 6 6 3 8 1 demo: import java.util.*; public class Main { public static void main(String args[]) { Scanner scan = new 

从网易的一道多线程笔试题学习wait与notify来控制线程同步

题目 : 有三个线程分别打印A.B.C,请用多线程编程实现,在屏幕上循环打印10次ABCABC… package my.thread.test; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class PrintThreadExample { public static void main(String[] args) { PrintThreadExample