`
cy729215495
  • 浏览: 127737 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

面试题目字符统计

阅读更多

有人问:

求第一个无重复字符,如"total"的第一个无重复字符是o,"teeter"的第一个无重复字符是r,效率要优于O(n的平方)
public static Character FirstNonRepeated(String)

 

 

说句实话,形如这样的字符串统计规律(什么按字符出现次数排序之类的)的题目,在笔试题目中屡见不鲜,在论坛里面总是有人在问。
笔试是关键,笔试不行,大公司想都不要想了。
这里面方法有很多种,我有一种方法,面向对象的,可解此类问题!

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

public class Tongji {

    /**
     * @param args
     */
    char ch;

    int count = 1;

    int index;

    public Tongji(char ch, int index) {
        this.ch = ch;
        this.index = index;
    }

    @Override
    public int hashCode() {//eclipse自动生成的
        final int PRIME = 31;
        int result = 1;
        result = PRIME * result + ch;
        result = PRIME * result + count;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final Tongji other = (Tongji) obj;
        if (ch != other.ch)
            return false;
        if (count == other.count) {
            other.count++;

        }
        return true;
    }

    public static void main(String[] args) {
        String a = "total";
        HashSet set = new HashSet();
        for (int i = 0, k = a.length(); i < k; i++) {
            set.add(new Tongji(a.charAt(i), i));
        }
        List list = new ArrayList(set);
        Collections.sort(list, new Comparator() {//按索引排序
            public int compare(Object o1, Object o2) {
                Tongji t1 = (Tongji) o1;
                Tongji t2 = (Tongji) o2;

                if (t1.index > t2.index)
                    return 1;
                return 0;
            }
        });

        for (Iterator it = list.iterator(); it.hasNext();) {
            Tongji tj = (Tongji) it.next();
            if (tj.count == 1) {
                System.out.println("char:" + tj.ch + " count:" + tj.count);
                break;
            }
        }

    }
}


 这就是面向对象的强大威力!

分享到:
评论
60 楼 yyf16 2010-01-13  
<p> </p>
<pre name="code" class="java">import java.util.HashMap;
import java.util.Map;


public class firstNonRepeatedChar  {

    public static void main(String args[]) {
        String s = "tbbbotoal";
        Map map = new HashMap();       
        char[] charArgs = s.toCharArray();
        char flag = ' ';
        for(char c : charArgs){
           
            if(!map.containsKey(c) &amp;&amp; flag != c){
                map.put(c, "value");
            } else {
                map.remove(c);
                flag = c;
            }
        }
       
        System.out.println(map.keySet().toArray()[0]);
    }
}</pre>
<pre name="code" class="java">输出:a</pre>
59 楼 piao_bo_yi 2010-01-11  
asd 写道
这种字符统计,必然是一个255大小的状态数组啊,在c程序员看来都是拿不出手的题目,用什么库函数啊。

“箱子排序”果然是这种问题的通解啊~~~
58 楼 piao_bo_yi 2010-01-11  
piao_bo_yi 写道
asd 写道
这种字符统计,必然是一个255大小的状态数组啊,在c程序员看来都是拿不出手的题目,用什么库函数啊。

可是得输出第一个不重复的字符啊,你的方法能行么??

明白了,原来能行。
57 楼 piao_bo_yi 2010-01-11  
asd 写道
这种字符统计,必然是一个255大小的状态数组啊,在c程序员看来都是拿不出手的题目,用什么库函数啊。

可是得输出第一个不重复的字符啊,你的方法能行么??
56 楼 asd 2009-12-02  
这种字符统计,必然是一个255大小的状态数组啊,在c程序员看来都是拿不出手的题目,用什么库函数啊。
55 楼 yfkscu 2009-12-02  
<p>一个时间复杂度为n的算法。第一次发帖有什么不足之处还请指教哈!</p>
<p> </p>
<pre name="code" class="java">//一个时间复杂度为n的算法

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

public class TestClass {
public static void main(String[] args) {
HashMap&lt;Character, Integer&gt; map = new HashMap&lt;Character, Integer&gt;();
String str = "kabcdabc";
int len = str.length();
for (int i = 0; i &lt; len; i++) {
char c = str.charAt(i);
if (map.containsKey(c)) {
map.remove(c);
} else {
map.put(c, i);
}
}

int minIndex = len;
Entry&lt;Character, Integer&gt; minEntry = null;
for (Iterator&lt;Entry&lt;Character, Integer&gt;&gt; iter = map.entrySet()
.iterator(); iter.hasNext();) {
Entry&lt;Character, Integer&gt; entry = iter.next();
if (entry.getValue() &lt; minIndex) {
minEntry = entry;
}
}
System.out.println(minEntry.getKey());
}
}
</pre>
<p> 输出结果为:</p>
<p>k</p>
54 楼 sbkyv 2009-08-18  
最好不要把count放在循环里!犯了错误
53 楼 sbkyv 2009-08-18  
           来个php的
            $old =str_split("eerrttyyf");
            $chars = array_flip($old);
            $l = count($old);
            for($i=0;$i<$l;$i++){
                if($i==$chars[$old[$i]]){
                    echo($old[$i]);
                    break;
                }
                else
                {
                    $chars[$old[$i]]=0;
                }
            }
52 楼 rabbitbug 2009-08-17  
这种算法题,就不是让你用java类库来做的,肯定是要用最简单的东西,一用到类库效率要低好几个等级
51 楼 gowish 2009-08-05  
还一种更快的:
private static char getDuplicateChr2(String param) {
char[] chrList = param.toCharArray();
for (int i=0;i<chrList.length;i++) {
if (param.indexOf(chrList[i]) == param.lastIndexOf(chrList[i])) {
return chrList[i];
}
}
return ' ';
}
50 楼 gowish 2009-08-05  
private static char getDuplicateChr(String param) {
char[] chrList = param.toCharArray();
List<Character> unique = new ArrayList<Character>();
for(int i=0;i<chrList.length;i++) {
if (unique.contains(chrList[i])) {
continue;
} else {
int index = param.indexOf(chrList[i]);
            if (index == i) {
                if (-1 != param.substring(index+1).indexOf(chrList[i])) {
                unique.add(chrList[i]);
                continue;
                } else {
                return chrList[i];
                }
            } else {
            break;
            }
}
}
return ' ';
}
49 楼 kukuqiu001 2009-07-20  
我是根据异常兄的linkedHashMap改写的
统计字符串里面每个字母出现的频率


import java.util.LinkedHashMap;
import java.util.Map.Entry;


public class CountCharInString {

	public static void main(String[] args) {
       String str ="total";
       char[] charArr = str.toCharArray();
       LinkedHashMap<String, Integer> linkedMap = new LinkedHashMap<String, Integer>();
       int count=1;
       for(char ch: charArr){
    	   String chStr = ch+"";
    	   if(linkedMap.get(chStr)!=null){
    		   linkedMap.put(chStr, linkedMap.get(chStr)+1);
    	   }else{
    		   linkedMap.put(chStr, count);
    	   }
    	   
       }
       
       for(Entry<String, Integer> temp : linkedMap.entrySet()){
    	 if(temp.getValue()!=null && temp.getKey()!=null){
    		 System.out.println("key =" + temp.getKey()+",value ="+ temp.getValue());
    	 }
       }
	}

}
48 楼 cy729215495 2009-07-17  
google_fans 写道
cy729215495 写道
而且这是笔试题目,笔试是有时间限制的,用这些最底层的代码来写做这样的题目,
花的时间很长。当然现在不是笔试,你可以在机器上面运行无数遍了然后把代码贴过来,
我们要的是速度和规则来解这类题目,凡事有规律了,当然就好做了!


这个题目的C语言版本很快的,熟悉的人几分钟就OK了。

比如说一个题目需要用hash表来解决,一个人是用c语言实现了自己的hash结构,一个人是用的类库。
你喜欢哪个人?

哦?就算是熟悉的人碰到这样的题目了,用算法几分钟就能搞定的人并不多吧。
47 楼 clx_wq 2009-07-16  
String str="toaltoa";

for(int i=0; i<str.length(); i++){
int count=0;
for(int j=0; j<str.length(); j++){
if(String.valueOf(str.charAt(i)).equals(String.valueOf(str.charAt(j)))){
count+=1;
}
}
if(count==1){
System.out.print(str.charAt(i));
break;
}
}
46 楼 google_fans 2009-06-05  
cy729215495 写道
而且这是笔试题目,笔试是有时间限制的,用这些最底层的代码来写做这样的题目,
花的时间很长。当然现在不是笔试,你可以在机器上面运行无数遍了然后把代码贴过来,
我们要的是速度和规则来解这类题目,凡事有规律了,当然就好做了!


这个题目的C语言版本很快的,熟悉的人几分钟就OK了。

比如说一个题目需要用hash表来解决,一个人是用c语言实现了自己的hash结构,一个人是用的类库。
你喜欢哪个人?
45 楼 google_fans 2009-06-05  
case0079 写道
那个C程序是用空间换时间.
实际使用中感觉还是LINKEDHASHMAP稳定些.


这个空间开销很小的

如果有中文,开销要大些
44 楼 yzzh9 2009-06-03  
统计重复个数的用上面那个c程序对应的java版改动一下就可以了:
public class firstNonRepeatedChar {
	private  static final int MAX_CHAR = 256;   
	
	public static void main(String[] args) {
		String str = "tootaddl";
		int count = firstNoRepeatedChar(str);
		System.out.println(count);
	}

	public static int firstNoRepeatedChar(String str) {
		 int i = 0;   
		 int j = 0;   
		 int count = 0;
		 int[] p = new int[MAX_CHAR]; 
		 char[] chars = str.toCharArray();
		 //初始化数组p,p用于保存字符出现的次数		 
		 for (j = 0; j < MAX_CHAR; j++) {   
		  p[j] = 0;   
		 } 
		 
		 //统计字符出现的次数	
		 for(i=0;i<chars.length;i++){
			 p[chars[i]]++;
		 }
		 
		 for(int n=0;n<MAX_CHAR;n++){
			 if(p[n]>1) count++;
		 }
		 return count;
	}
}
43 楼 wnzz95391511 2009-06-03  
我感觉像这样的笔试题,主要考察的还是效率方面,要首先以O(n)为基准点。
不使用类库的为好!
之前用C的那个程序和对应的JAVA版本,都挺好的。
42 楼 抛出异常的爱 2009-06-03  
cy729215495 写道
这么多的答案,我原本写这个程序是唤醒大家算法问题用面向对象的方法来做很好很强大,用c当然可以实现。

现在如果题目改为求统计重复字符串的个数,怎么做呢?希望大家接着往下面做!

个数不爽....

最长自反字符串好玩一些.
abcdeacdrtt=>cd(2)
41 楼 merman 2009-06-03  
<div class="quote_title">楼主 写道</div>
<div class="quote_div">
<pre name="code" class="java">    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final Tongji other = (Tongji) obj;
        if (ch != other.ch)
            return false;
        if (count == other.count) {
            other.count++;

        }
        return true;
    }
</pre>
</div>
<p>我觉得equals不能这样来用,使用equals要满足 自反性 a.equals(a) is true; 对称性 a.equals(b) = b.equals(a); 传递性 a.equals(b) = true b.equals(c) = true 那么 a.equals(c) = true; 一致性 任何时候调用a.equals(b)得到的结果都是一样的。</p>

相关推荐

    面试题目_cc++面试-----17道经典编程题目分析

    本文档提供了17道经典的C++面试题目,涵盖了C++语言的各种基础语法和算法,包括字符串处理、数字处理、数组处理等。每个题目都提供了详细的解释和参考答案,旨在帮助读者更好地理解C++语言的实现细节和解决问题的...

    C/C++面试题目及解答.doc

    请完成以下题目。注意,请勿直接调用 ANSI C 函数库中的函数实现。 a)请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数,并请给出该题的至少一个不同解法。 第一种unsigned int TestAsOne0(char ...

    富士康JAVA面试题2.doc

    本资源主要关注Java面试题目,涵盖了日期计算、字符串处理、排序算法和Java与C++混合编程等方面的知识点。 日期计算 在Java中,计算某一特定日期是星期几可以使用以下方法: 1. 使用`java.time`包中的`LocalDate`...

    SQLServer高频面试题及答案

    SQL Server高频面试题及答案 数据库基础知识篇 1. 主键、外键、超键、候选键 超键是关系模式中能唯一标识元组的属性集。候选键是最小超键,即没有冗余元素的超键。主键是数据库表中对储存数据对象予以唯一和完整...

    数据挖掘分析面试题.docx

    数据挖掘分析面试题 数据挖掘分析面试题全文共16页,当前为第1页。数据挖掘分析面试题全文共16页,当前为第1页。2011Alibaba数据分析师(实习)试题解析 数据挖掘分析面试题全文共16页,当前为第1页。 数据挖掘分析...

    IT软件开发笔试面试题.docx

    本文档收录了 21 道 IT 软件开发笔试面试题,涵盖了字符串处理、算法设计、数据结构等多方面的知识点。下面是对每道题目的详细解释和知识点总结: 1. 字符串排列:该题目要求输入一个字符串,输出该字符串中所有...

    嵌入式面试题集-经典

    嵌入式面试题集-经典 以下是根据给定的文件生成的知识点: 1. 排序算法:在华为面试题中,问哪种排序方法最快?这需要候选人了解不同排序算法的时间复杂度和空间复杂度,例如冒泡排序、选择排序、插入排序、归并...

    Shell、awk、sed面试题汇总(无答案).doc

    Shell、awk、sed 面试题汇总 以下是从给定的文件中生成的相关知识点: Shell 1. 变量赋值:在 Shell 中,可以使用多种方法来赋值变量,包括直接赋值、使用 `read` 命令、使用命令行参数和使用命令的输出。 2. ...

    java面试题大全(2012版)

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 65 5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和...

    BI常见面试题

    BI 常见面试题汇总 BI(Business Intelligence)是企业智能化的核心组件,涉及到数据分析、报表设计、数据仓库、数据挖掘等多个方面。面试BI相关岗位时,需要具备丰富的知识储备和实践经验。以下是BI常见面试题汇总...

    Leetcode刷题笔记-大厂面试突破集

    总的来说,LeetCode的题目集可以帮助程序员提升算法思维,熟练掌握多种数据结构和算法,提高解决问题的能力,对于准备面试和日常开发都具有很大的价值。通过不断地刷题和实践,能够逐步提升编程水平,为进入大厂或在...

    华为技术面试题1,图片的形式展现

    华为春季招聘,技术面试题目,主要是对字符串的操作,统计和描述等,判断所得字

    程序员面试攻略 part1(共2个)

    第2章程序设计面试题的解答思路9 2.1 面试过程9 2.2 关于面试题11 2.3 答题方法11 2.4 遇到疑难时13 2.5 对解决方案进行分析15 第3章链表19 3.1 单向链表19 3.1.1 头指针的修改20 3.1.2 遍历21 3.1.3 ...

    程序员面试攻略part 2(共2个)

    第2章程序设计面试题的解答思路9 2.1 面试过程9 2.2 关于面试题11 2.3 答题方法11 2.4 遇到疑难时13 2.5 对解决方案进行分析15 第3章链表19 3.1 单向链表19 3.1.1 头指针的修改20 3.1.2 遍历21 3.1.3 ...

    Java面试经典算法

    7. 字符统计问题:该题目考查了循环控制和字符处理能力。利用 while 语句可以统计出英文字母、空格、数字和其它字符的个数。 8. 数列求和问题:该题目考查了算法设计和实现能力。关键是计算出每一项的值,然后将...

    c++ 面试题 总结

    C++面试题 1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态? virtual修饰符会被隐形继承的。 private 也被集成,只事派生类没有访问权限而已 virtual可加可不加 子类的...

    python笔试题目_【Python】【面试必看】Python笔试题.pdf

    在面试中,Python 笔试题目是必不可少的一部分,本文总结了常见的 Python 笔试题目,涵盖列表、字符串、格式化输出、队列、交换、水仙花数、完全数、排序等多个方面,为准备 Python 面试的求职者提供了有价值的参考...

    Java面试宝典-经典

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 65 5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和...

    java面试宝典2012

    各种java面试题集,面试前必备哦, 1. Java基础部分 7 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 8 2、Java有没有goto? 8 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套...

    最新Java面试宝典pdf版

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 65 5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和...

Global site tag (gtag.js) - Google Analytics