日期:2014-05-20  浏览次数:20816 次

刚刚讯雷的一个笔试题
一共五题,就说有意思的这一题
题目大概是:有数组int []d={1,2,-5,6,等等};
删除其中等于10的元素并返回删除的个数,要求时间和空间做优化,要先想思路
题目是c的,其实用java也一样

数组中,删除一个数则会令删除这个数后面的数都向前移,如果有10W个数,则要移10W-1,如果我们减少移动的次数,或者只移一个数,那么效率将会得到提高
我的做法是设定查找的左右界限
int l=0,r=数组长度-1;
int count;//删除的个数
while(l<r){
  while(l<r&&d[r]==10){
  r--;
  count++;
  }
  while(l<r&&d[l]!=10)l++;
  if(l<r){
  d[l]^=d[r];//交换值
  d[r]^=d[l];
  d[l]^=d[r];
  l++;r--;count++;
  }
}
return count;
不知道还有什么更好的方法

机试悲剧呀,忘记二个函数了,又上不了网查~
哎,让我明天等通知,然后又加上一句,如果没通知不要来。桌子上呀,都是杯子呀~~~
找工作,应届生,在深圳南山,先做实习生也行,攒钱买电脑了
【工作经历详细介绍】
以下是学校做过的一些主要项目开发:
猜数字游戏(C)模猜数字游戏的各个功能实现。
迷宫游戏(C)迷宫的随机生成和最佳路径的寻找
通讯录(vc6.0+access)和(java+mysql)仿QQ通讯录,联系人添加,修改,删除,消息的收发。
计算器(HTML javascript),模拟计算器组合要给你实现。
俄罗斯方块(java),实现俄罗斯方块各种功能,支持扩展高级功能。
即时聊天工具(java)仿QQ,Socket,多线程技术,p2p。
mp3播放器(java 非jmf)仿千千静听,解析和使用千千静听皮肤,实现在线查找和下载mp3。
数学公式分析器(java netbean)高级科学计算表达式的计算,纠正大部分表达式。
企业员工资料管理系统(java netbean,ms sql2000)对员工信息及工资的添加、删除、修改、查询。
基于B2B的网上批发交易系统(asp.net C# + sql server),主要实现发布出售或收购商品信息,可以展显商品;通过该系统以方便、有效的进行批发物品的交易等的管理。
在线音乐网(asp.net C# + sql server 2k)实现文件的上传,媒体的播放,商品的卖出,网站和数据库管理方便。
B2B在线交易批发网(毕设asp.net C# + sql server 2k)兼容b2c,c2c,可以实现在线商品的交易和讯息的发布。
在线聊天室(JAVA),主要实现在线聊天功能,主要运用Socket,多线程技术,自定义聊天室通讯协议。
QQ找茬测试版(JAVA,jni,屏幕截图),主要完成了自动找茬功能。 
【技能专长】
1.精通java以及SQL SERVER数据库,熟悉c++,html,asp.net等编程语言
2.熟练掌握应用powerdesigne ,netbeans,Visual Studio 2008,Dreamweaver等工具
3.了解Thread、Socket、JDBC等J2EE核心技术
4.熟悉AWT,Swing等包的使用
5.较强的逻辑和分析能力

------解决方案--------------------
你那样效率不高呀,
可不可以用改进和二分法来实现,并记下删除的次数
------解决方案--------------------
探讨
一共五题,就说有意思的这一题
题目大概是:有数组int []d={1,2,-5,6,等等};
删除其中等于10的元素并返回删除的个数,要求时间和空间做优化,要先想思路
题目是c的,其实用java也一样

数组中,删除一个数则会令删除这个数后面的数都向前移,如果有10W个数,则要移10W-1,如果我们减少移动的次数,或者只移一个数,那么效率将会得到提高
我的做法是设定查找的左右界限
i……

------解决方案--------------------
这么。
------解决方案--------------------
不错的,
------解决方案--------------------
Java code
    public static void main(String[] args) {
        int [] a={2,1,2,-5,6,10,34,9,10,10,33};
        int count=0;
        ArrayList<Integer> my=new ArrayList<Integer> ()    ;
        for (int i = 0; i <a.length; i++) {
            my.add(a[i]);
        }        
        while((boolean) my.remove((Object)10)){
            count++;            
        }
        System.out.println(count);
    }

------解决方案--------------------
C/C++ code

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a[]={2,1,2,-5,6,10,34,9,10,10,33};
    int count = 0;

    int b = sizeof(a)/sizeof(int);
    int *p = a;
    int *pp = &a[b];
    
    int i = 0;

    while(i < b)
    {
        if (a[i] == 10)
        {
            a[i] = *p;
            p++;
            count++;
        }
        i++;
    }
    
    printf("count:%d\n", count);

    while(p < pp)
    {
        printf("%d ", *p);
        p++;
    }    

    return 0;
}

------解决方案--------------------
C/C++ code

int TrimNum(int arr[], int len, int num)
{
    int total = 0, index = 0;
    
    while (index < len)
    {
        if (arr[index] == num)
        {
            totoal++;
            continue;
        }

        if (total > 0)
            arr[index - total] = arr[index];
        index++;
    }
    return total;
}