练习:面试题解题(不断更新....)

使用java(groovy来写) 毕竟目的是为了代码的精短

自己做练习的 不一定是对的 如有错误欢迎拍脸

 

48、找出数组中唯一的重复元素

1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次.
每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,
能否设计一个算法实现?

来自:http://blog.csdn.net/v_JULY_v/article/details/6234496

解法 其实很简单的...把那1001个元素加起来然后减去1+2+...+1000就可以了

解法:

def arr=new int[1001];
arr=arr.collect({i -> -1}) //初始化数据
def r=new Random();
int dup=r.nextInt(1000)+1; //选中一个元素重复 1~1000
arr[r.nextInt(arr.size())]=dup; //确定重复的位置
for(def i=1;i<=1000;i++)
{
 def loc=r.nextInt(arr.size());
 while(arr[loc]!=-1)
 {
  loc=(loc+1)%arr.size();
 }
 arr[loc]=i;
}
println dup
arr.inject(0,{sum,value -> sum+value})-(1+1000)/2*1000

 

 

 

3、给出一个函数来输出一个字符串的所有排列。
来自:http://blog.csdn.net/v_JULY_v/article/details/6234496

代码直接输出 所以字符串如果有重复的元素就会有重复的结果 长一点的字符串会让这个程序挂掉,,  

 

void sort(remain,newString){
  if(remain=="") println newString
  for(int i=0;i<remain.length();i++)
  {
    sort(remain-remain[i],newString+remain[i])
  }
}

sort("AbcDe","")

 话说groovy中对String + -操作的支持真的很方便啊...

 

 

  1. 9月5日,华为2014校园招聘的机试题目
    通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
    压缩规则:
        1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
        2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。
    要求实现函数: 
         void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
        输入pInputStr:  输入字符串lInputLen:  输入字符串长度
        输出 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
    注意:只需要完成该函数功能算法,中间不需要有任何IO的输入输出
    示例 
        输入:“cccddecc”   输出:“3c2de2c”
        输入:“adef”     输出:“adef”
        输入:“pppppppp” 输出:“8p”
来自:http://blog.csdn.net/v_july_v/article/details/11921021#comments

原文使用C++的吧 我还是用groovy来做 这个是个很经典的压缩算法 叫什么来着忘记了..

只要注意最后还需要一次判断就好了

def stringZip=
{
 s->
  def oldC=""
  def count=0
  def newString=""
  for(def i=0;i<s.length();i++)
  {
   if(s[i]==oldC)
   {
    count++;
   }
   if(s[i]!=oldC){ 
     if(count<=1){
      newString+=oldC;
     }else{
      newString+=count+oldC;
     }
     count=1;
     oldC=s[i]
   }
  }
  //这边额外多一次 
  if(count<=1){
      newString+=oldC;
     }else{
      newString+=count+oldC;
  }
  return newString
}
println stringZip("cccddecc")
println stringZip("adef")
println stringZip("xxxyyyyyyz")
println stringZip("pppppppp")

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值