`
cuiran
  • 浏览: 82293 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

经典的两个面试题,作出来你“牛”!

    博客分类:
  • java
阅读更多
1.将正整数1到N(N>1)排成一排,然后从第一个数开始取走数字,每间隔M(M>1)个取一个(譬如M=3,那么第一个取1,第二个取4,第三个取7...),一遍完成后再取第二遍,问取L遍(L<M)后,剩下哪些数字?


2.从一个有序数组中(从小到大)使用二分法查找一个给定的数的位置?



以上两题可用JAVA或javascript来完成。

分享到:
评论
11 楼 chinabrle 2009-06-02  
第1题的JAVA代码:

public class Func {
    public static void f(int N,int M,int L){
        for(int i=1;i<=N;i++)
        {
            int j=i%M;
            if(j == 0)
                j=M;
            if(j > L)
                System.out.print(i+" ");
        }
    }

    public static void main(String[] args)
    {
        f(12,4,3);
    }
}

//输出:
//4 8 12

10 楼 zhanger 2009-04-16  
貌似没那么难吧?
第一个就是一个简单的模拟,第二个就是二分查找啊
9 楼 King_MrGao 2009-04-03  
这题就是解方程,找规律
public static void main(String [] args){
getN(30,3,3);
}

        /**
         * @param N 给定数范围
         * @param M 间隔
         * @param L 提取次数
        */
public static void getN(int N,int M,int L){
//计算次范围、提取次数、间隔下,最总剩余几个数字
int r_length = (N-1)/(int)Math.pow(M,L);
System.out.println("r_length:"+r_length);

for(int i=0;i<=r_length;i++){
System.out.println(i*(int)Math.pow(M,L)+1);
}
}
希望大侠们多给提意见!
8 楼 diaodou 2009-03-27  
diaodou 写道
diaodou 写道
cuiran 写道
1.将正整数1到N(N>1)排成一排,然后从第一个数开始取走数字,每间隔M(M>1)个取一个(譬如M=3,那么第一个取1,第二个取4,第三个取7...),一遍完成后再取第二遍,问取L遍(L<M)后,剩下哪些数字?


2.从一个有序数组中(从小到大)使用二分法查找一个给定的数的位置?



以上两题可用JAVA或javascript来完成。


1. 假设数字N是被第f(N, M)次取到,比如,f(1,3)=f(4,3)=f(7,3)=1,f(2,3)=2,那么,归纳一下,有下面公式:
if ((N+M-1) % M ==0) f(N, M) = 1
else f(N, M) = f(N-(N+M-1)/M, M) + 1
按此,可以得出,所有f(N, M) > L的N就是剩下的数字。

我解释下好了,以N=11,M=3作为例子,f(N, M)表示N这个数字被第f(N,M)次取到,可以得出
M=3
N: 1,2,3,4,5,6,7,8,9,10,11,
f: 1,2,3,1,4,2,1,5,3,1, 2,
L=3,剩下的就是5,8。

怎么求出f(N, M)呢?
N: 1,2,3,4,5,6,7,8,9,10,11,
第一次取数字以后,变为
N':2,3,5,6,8,9,11
可以看到,如果N+M-1被M整除,就是1,4,7这些,已经被删掉了,那么f=1
而剩下的数字,往前排,重新标号以后,有公式: N => N-(N+M-1)/M,不如,11=> 7
那么,可以知道,f(N, M) = f(N-(N+M-1)/M, M) + 1

这个公式怎么用呢?
我们先知道,
f(1, M) = 1
f(2, M) = 2, ...
f(M, 0) = M,
在根据公式f(N, M) = f(N-(N+M-1)/M, M) + 1,递推,可以把所有f(N, M)求出来

或者可以推导出一个表达式来。。。
7 楼 diaodou 2009-03-27  
diaodou 写道
cuiran 写道
1.将正整数1到N(N>1)排成一排,然后从第一个数开始取走数字,每间隔M(M>1)个取一个(譬如M=3,那么第一个取1,第二个取4,第三个取7...),一遍完成后再取第二遍,问取L遍(L<M)后,剩下哪些数字?


2.从一个有序数组中(从小到大)使用二分法查找一个给定的数的位置?



以上两题可用JAVA或javascript来完成。


1. 假设数字N是被第f(N, M)次取到,比如,f(1,3)=f(4,3)=f(7,3)=1,f(2,3)=2,那么,归纳一下,有下面公式:
if ((N+M-1) % M ==0) f(N, M) = 1
else f(N, M) = f(N-(N+M-1)/M, M) + 1
按此,可以得出,所有f(N, M) > L的N就是剩下的数字。

我解释下好了,以N=11,M=3作为例子,f(N, M)表示N这个数字被第f(N,M)次取到,可以得出
M=3
N: 1,2,3,4,5,6,7,8,9,10,11,
f: 1,2,3,1,4,2,1,5,3,1, 2,
L=3,剩下的就是5,8。

怎么求出f(N, M)呢?
N: 1,2,3,4,5,6,7,8,9,10,11,
第一次取数字以后,变为
N':2,3,5,6,8,9,11
可以看到,如果N+M-1被M整除,就是1,4,7这些,已经被删掉了,那么f=1
而剩下的数字,往前排,重新标号以后,有公式: N => N-(N+M-1)/M,不如,11=> 7
那么,可以知道,f(N, M) = f(N-(N+M-1)/M, M) + 1

这个公式怎么用呢?
我们先知道,
f(1, M) = 1
f(2, M) = 2, ...
f(M, 0) = M,
在根据公式f(N, M) = f(N-(N+M-1)/M, M) + 1,递推,可以把所有f(N, M)求出来
6 楼 bonny 2009-03-26  
cuiran 写道
bonny 写道
第一个问题

任何一个数字x经n轮挑选后,如果还存在,那么其值是
f(x) = x- n(|x/m|+1)
且 f(x)%m !=1

解此方程
N:数列长度
m:。。
n:遍历次数
    public static void f(int N, int m, int n) {
        boolean left = true;
        for (int i = 1; i <= N; i++) {
            left = true;
            for (int j = 0; j < +n; j++) {
                if ((i - j * (Math.abs(i / m) + 1)) % m == 1) left = false;
            }
            if (left)
                System.out.println(i);
        }

    }




你的思路很好,但有个问题:如果这样调用f(10, 4, 1);结果为:
2
3
4
6
7
8
10
那这样调用f(10, 4, 1)应该是:
3
4
6
8
10
而你的是:
3
4
6
10


我的分析错了,红色的部分应该是“位置”,即位置
设x在n次遍历后的位置为
f(x,n) = f(x,n-1) - ((|(f(x,n-1)-1)/m|+1)
f(x,0) = x
f(x,n)%m != 1

    public static void f(int N,int m,int n){
        boolean left;
       for(int i=1;i<N+1;i++){
           left = true;
           for(int j=0;j<n;j++){
              if(position(i,m,j)%m == 1) left = false;
           }
           if(left)
           System.out.println(i);
       }
    }


    public static int position(int x,int m,int n){
        if(n==0)
            return x;
        else
            return position(x,m,n-1) - Math.abs((position(x,m,n-1)-1)/m) -1;
    }
5 楼 叩舷而歌 2009-03-26  
基础的数据结构题……初学数据结构的时候就拿来练手,算不得牛。
4 楼 cuiran 2009-03-26  
bonny 写道
第一个问题

任何一个数字x经n轮挑选后,如果还存在,那么其值是
f(x) = x- n(|x/m|+1)
且 f(x)%m !=1

解此方程
N:数列长度
m:。。
n:遍历次数
    public static void f(int N, int m, int n) {
        boolean left = true;
        for (int i = 1; i <= N; i++) {
            left = true;
            for (int j = 0; j < +n; j++) {
                if ((i - j * (Math.abs(i / m) + 1)) % m == 1) left = false;
            }
            if (left)
                System.out.println(i);
        }

    }




你的思路很好,但有个问题:如果这样调用f(10, 4, 1);结果为:
2
3
4
6
7
8
10
那这样调用f(10, 4, 1)应该是:
3
4
6
8
10
而你的是:
3
4
6
10
3 楼 bonny 2009-03-26  
第一个问题

任何一个数字x经n轮挑选后,如果还存在,那么其值是
f(x) = x- n(|x/m|+1)
且 f(x)%m !=1

解此方程
N:数列长度
m:。。
n:遍历次数
    public static void f(int N, int m, int n) {
        boolean left = true;
        for (int i = 1; i <= N; i++) {
            left = true;
            for (int j = 0; j < +n; j++) {
                if ((i - j * (Math.abs(i / m) + 1)) % m == 1) left = false;
            }
            if (left)
                System.out.println(i);
        }

    }



2 楼 cuiran 2009-03-26  
第二题解:

/**
*
* @param num 给定的数
*/
public static void woke2(int num){
int array[]=new int[]{1,2,3,4,5,6,7,8,9,10};
int length=array.length;
int middle_num=(length)/2-1;
while(true){
if(array[middle_num]==num){
System.out.println(num+"的位置是:"+middle_num);
break;
}else{
if(array[middle_num]>num){
System.out.println("你输入的数字比"+array[middle_num]+"小");
middle_num=middle_num-1;

}else{
System.out.println("你输入的数字比"+array[middle_num]+"大");
middle_num=middle_num+1;

}

}
}

}
1 楼 diaodou 2009-03-26  
cuiran 写道
1.将正整数1到N(N>1)排成一排,然后从第一个数开始取走数字,每间隔M(M>1)个取一个(譬如M=3,那么第一个取1,第二个取4,第三个取7...),一遍完成后再取第二遍,问取L遍(L<M)后,剩下哪些数字?


2.从一个有序数组中(从小到大)使用二分法查找一个给定的数的位置?



以上两题可用JAVA或javascript来完成。


1. 假设数字N是被第f(N, M)次取到,比如,f(1,3)=f(4,3)=f(7,3)=1,f(2,3)=2,那么,归纳一下,有下面公式:
if ((N+M-1) % M ==0) f(N, M) = 1
else f(N, M) = f(N-(N+M-1)/M, M) + 1
按此,可以得出,所有f(N, M) > L的N就是剩下的数字。

相关推荐

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....

    Java 经典常问面试题

    一个原来在团队中没有存在感每天划水的人,却有可能因为碰巧面试前一天晚上刷到了浏览器缓存机制的面试题,而被认为是基础扎实的大牛。实际上,如果面试总是能准确地反映出一个人真正的技术能力,大公司里就不会有...

    经典T-SQL面试题

    ### 经典T-SQL面试题解析 #### 题目一:创建空表与条件筛选 **原题描述**:"使用`SELECT INTO`语句从`tb_amount`表中选择所有列到新表`tb_temp`,但在选择时加入一个永远不成立的条件(`1&lt;&gt;1`),确保`tb_temp`为空...

    c#经典教程/设计模式/笔试宝典/面试题(2/2)

    本压缩包主要内容为c#教程(书籍)及一些经典资料,主要包括...各个公司面试题(214题) 23种设计模式.pdf c++笔试面试宝典2009版.doc 程序员面试宝典.pdf 高质量C++-C编程指南.mht 注意:共有两个分卷,这是分卷2。

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    面试题12:能否用两个栈实现一个队列的功能 10.5 二叉树 面试题13:建立一个二叉树 面试题14:计算一棵二叉树的深度 面试题15:在二元树中找出和为某一值的所有路径 第11章 排序 11.1 插入排序 面试题1:编码实现...

    c#经典教程/设计模式/笔试宝典/面试题(1/2)

    本压缩包主要内容为c#教程(书籍)及一些经典资料,主要包括...各个公司面试题(214题) 23种设计模式.pdf c++笔试面试宝典2009版.doc 程序员面试宝典.pdf 高质量C++-C编程指南.mht 注意:共有两个分卷,这是分卷1。

    google面试题.pdf

    #### 十三、你在一幢100层高的大楼中,给了你两个鸡蛋。鸡蛋有时非常易碎,有时又异常坚韧。这意味着,如果在第1层扔下鸡蛋,鸡蛋或许会碎裂,而如果是从第100层扔下鸡蛋,鸡蛋或许安然无恙。这两只鸡蛋一模一样。你...

    用友软件面试题

    算法实现中,我们可以使用分治策略,选择一个pivot元素,然后将数组分成两个部分,递归排序这两个部分。 本篇总结了用友软件面试题中的知识点,涵盖了Java基础知识、数据结构、算法、数据库等方面,旨在帮助读者更...

    iOS精华面试题 pdf和word版本.zip

    从描述来看,这份资料被称作“大牛精品”和“面试题精华汇总”,暗示了它可能由行业专家编写,包含了一系列高质量的面试问题和解答,旨在帮助求职者顺利进入知名大公司。 iOS面试题涵盖的知识点广泛且深入,通常...

    牛叉公司面试题集之C和C++版本

    牛叉公司面试题集中的C和C++知识点涵盖面很广,包括基础语法、数据结构、内存管理、算法、网络通信等方面。下面我们详细解读这些知识点。 1. 关于static关键字的用途,主要可以限制变量的作用域和设置变量的存储域...

    2019阿里巴巴技术面试题汇总.pdf

    由于文档标题为《2019阿里巴巴技术面试题汇总.pdf》,且描述提到包含CDN、数据库、前端、后端、存储等技术面试题汇总,本文将重点讨论文档中提供的三个面试题样本,它们分别涉及了数据结构(单向链表逆序)、数值...

    世界500强面试题(情商篇).pdf

    - S先生在下午1点参加婚礼,4点参加葬礼,这两个活动在同一天,但时间上存在冲突,因此不合理之处在于S先生无法在婚礼结束后及时赶到葬礼现场。 #### 9. 快马加鞭 **问题描述:** 如何在最短时间内将四匹马从甲村...

    【牛客网】Java开发校招面试考点汇总(附面试题和答案).pdf

    - equals()和hashCode()的重写原因:equals()用于比较两个对象的内容是否相等,hashCode()用于获取对象哈希码。当对象作为哈希表的键时,重写这两个方法可确保对象的唯一性。 - Map的分类和使用场景:包括HashMap...

    2020年腾讯精选面试题及答案

    3. 有序链表合并:这是一个常见的编程问题,需要考虑两个有序链表如何合并为一个。解决方法通常涉及递归和迭代,选择较小的节点作为下一个合并节点,并递归地处理剩余节点。 4. 硬币找零问题:这个问题属于组合数学...

    笔试面试题的概要介绍与分析

    - **问题描述**:给定一个整数数组,求该数组中任意两个元素的最大差值,条件是较小的元素必须出现在较大的元素之前。 - **解决方案思路**: - **初始化**:设置初始最小值为整型最大值,最大差值为 0。 - **遍历...

Global site tag (gtag.js) - Google Analytics