论坛首页 招聘求职论坛

面试题目字符统计

浏览 22637 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-06-02   最后修改:2009-06-02
shaquan6776 写道
抛出异常的爱 写道
cy729215495 写道
linkedmap,学习了!
高手果然就是高手!
如果我要对字符出现的次数按照从大到小的次序排序各位的方法就很不好扩展了!

如果只是要找出最大的....
我知道的有一种是正则但非常的难以理解.....朋友写出后看了一天都没想明白

把正则贴出来,让大家学习学习。

var regx = /(.)\1+/g;
    var toMatch = "aaaAAbbbcCCCddddddEEEEEEEEEEffffffffff";
    var arrMatch = toMatch.match(regx);
    var charLength = 0;
    var charIndex =0;
    for(var i =0;i< arrMatch.length;i++){
        var currentCharLength = arrMatch[i].split("").length;
        if(currentCharLength > charLength){
            charLength = currentCharLength; charIndex=i;
        }
    }
 
 alert(arrMatch[charIndex]);
0 请登录后投票
   发表时间:2009-06-02  
google_fans 写道
ywlqi 写道
抛出异常的爱 写道
被同事BS了
	public static void main(String arg[]){
		String test = "tatleae";
		char[] array = test.toCharArray();

		for(char tmp : array){
	
			if(test.indexOf(tmp)==test.lastIndexOf(tmp)){
				System.out.println(tmp);
				break;
			}
		}
	}


我喜欢这个实现,同时看出我还差得很远啊


方便是方便,效率呢?


indexOf()和lastIndexOf()的实现里面均包含一条FOR语句,加上外面的FOR语句.因此这个实现复杂度是N平方.不符合出题要求.
前面使用LINKEDHASHMAP实现从时间复杂度上讲是满足出题要求的.
0 请登录后投票
   发表时间:2009-06-02  
抛出异常的爱 写道
shaquan6776 写道
抛出异常的爱 写道
cy729215495 写道
linkedmap,学习了!
高手果然就是高手!
如果我要对字符出现的次数按照从大到小的次序排序各位的方法就很不好扩展了!

如果只是要找出最大的....
我知道的有一种是正则但非常的难以理解.....朋友写出后看了一天都没想明白

把正则贴出来,让大家学习学习。

var regx = /(.)\1+/g;
    var toMatch = "aaaAAbbbcCCCddddddEEEEEEEEEEffffffffff";
    var arrMatch = toMatch.match(regx);
    var charLength = 0;
    var charIndex =0;
    for(var i =0;i< arrMatch.length;i++){
        var currentCharLength = arrMatch[i].split("").length;
        if(currentCharLength > charLength){
            charLength = currentCharLength; charIndex=i;
        }
    }
 
 alert(arrMatch[charIndex]);

  这个方法只对连续重复的有用.
0 请登录后投票
   发表时间:2009-06-02  
shaobin0604 写道
#include <stdio.h>
#include <stdlib.h>

#define MAX_CHAR 256

int firstNonRepeatedChar(char str[], char *c) {
 int i = 0;
 int j = 0;
 int p[MAX_CHAR];
 for (j = 0; j < MAX_CHAR; j++) {
  p[j] = 0;
 }
 
 while (str[i] != '\0') {
  p[str[i]]++;
  i++;
 }

 for (i = 0; str[i] != '\0'; i++) {
  if (p[str[i]] == 1) {
   *c = str[i];
   return 1;
  }
 }
 return 0;
}

int main() {
 char str[] = "total";
 char a;
 if (firstNonRepeatedChar(str, &a) == 1) {
  printf("%c", a);
 } 
 return 0;
}


不符合题意:题目要求找第一个不重复的字符,这个实现是找最小的.
0 请登录后投票
   发表时间:2009-06-02  
case0079 写道
shaobin0604 写道
#include <stdio.h>
#include <stdlib.h>

#define MAX_CHAR 256

int firstNonRepeatedChar(char str[], char *c) {
 int i = 0;
 int j = 0;
 int p[MAX_CHAR];
 for (j = 0; j < MAX_CHAR; j++) {
  p[j] = 0;
 }
 
 while (str[i] != '\0') {
  p[str[i]]++;
  i++;
 }

 for (i = 0; str[i] != '\0'; i++) {
  if (p[str[i]] == 1) {
   *c = str[i];
   return 1;
  }
 }
 return 0;
}

int main() {
 char str[] = "total";
 char a;
 if (firstNonRepeatedChar(str, &a) == 1) {
  printf("%c", a);
 } 
 return 0;
}


不符合题意:题目要求找第一个不重复的字符,这个实现是找最小的.


这里找出的就是第一个不重复的字符,而且个人认为效率较高,也较简单。

如果是找最小频率分词,那可以考虑用hash算法。
0 请登录后投票
   发表时间:2009-06-02  
li = "aaaAAbbbcCCCddddddEEEEEEEEEEffffffffff"
print([enum for enum in li if li.count(enum)==1].pop())
0 请登录后投票
   发表时间:2009-06-02  
google_fans 写道
case0079 写道
shaobin0604 写道
#include <stdio.h>
#include <stdlib.h>

#define MAX_CHAR 256

int firstNonRepeatedChar(char str[], char *c) {
 int i = 0;
 int j = 0;
 int p[MAX_CHAR];
 for (j = 0; j < MAX_CHAR; j++) {
  p[j] = 0;
 }
 
 while (str[i] != '\0') {
  p[str[i]]++;
  i++;
 }

 for (i = 0; str[i] != '\0'; i++) {
  if (p[str[i]] == 1) {
   *c = str[i];
   return 1;
  }
 }
 return 0;
}

int main() {
 char str[] = "total";
 char a;
 if (firstNonRepeatedChar(str, &a) == 1) {
  printf("%c", a);
 } 
 return 0;
}


不符合题意:题目要求找第一个不重复的字符,这个实现是找最小的.


这里找出的就是第一个不重复的字符,而且个人认为效率较高,也较简单。

如果是找最小频率分词,那可以考虑用hash算法。



int p[MAX_CHAR]是记录各个字符的出现次数.但没有维护字符出现的顺序.
0 请登录后投票
   发表时间:2009-06-02  
要维护顺序干嘛,str里面有顺序。好好看下代码哈
0 请登录后投票
   发表时间:2009-06-02  
仔细看了下,确实是比较高效的方法.估计出题者想要的答案就是这个了.用LINKEDHASHMAP可能不太像笔试题目.
0 请登录后投票
   发表时间:2009-06-02   最后修改:2009-06-02
google_fans 写道
ywlqi 写道
抛出异常的爱 写道
被同事BS了
	public static void main(String arg[]){
		String test = "tatleae";
		char[] array = test.toCharArray();

		for(char tmp : array){
	
			if(test.indexOf(tmp)==test.lastIndexOf(tmp)){
				System.out.println(tmp);
				break;
			}
		}
	}


我喜欢这个实现,同时看出我还差得很远啊


方便是方便,效率呢?

哥们!其实,有些时候,你不用怀疑SUN的工程师写出来的String.indexOf()会像你所想象的实现! 不相信你可以自己去做个indexOf()的实现去做个试验。
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics