java 面试每日一题2

题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

注:如果想单独输出中文的个数和中文符号的个数,只需把isChinese()中的if语句修改

知识补充:

java不像C中拥有scanf这样功能强大的函数,大多是通过定义输入输出流对象。常用的类有BufferedReader,Scanner。

1、利用 Scanner 实现从键盘读入integer或float 型数据

  Scanner看作是System.in对象的支持者,System.in取得用户输入的内容后,交给Scanner来作一些处理.
  Scanner类中提供了多个方法:
  next():取得一个字符串;
  nextInt():将取得的字符串转换成int类型的整数;
  nextFloat():将取得的字符串转换成float型;
  nextBoolean():将取得的字符串转换成boolean型;
用Scanner获得用户的输入非常的方便,但是Scanner取得输入的依据是空格符,包括空格键,Tab键和Enter键.当按下这其中的任一
键时,Scanner就会返回下一个输入. 当你输入的内容中间包括空格时,显然,使用Scanner就不能完整的获得你输入的字符串.

2、利用 BufferedReader实现从键盘读入字符串并写进文件abc.txt中

  readLine()方法会返回用户在按下Enter键之前的所有字符输入,不包括最后按下的Enter返回字符

  使用BufferedReader对象的readLine()方法必须处理java.io.IOException异常(Exception).

3. str.getBytes();  如果括号中不写charset,则采用的是Sytem.getProperty("file.encoding"),即当前文件的编码方式,

      很多人写的是系统的默认编码,通过代码测试并非如此,实际得到的是文件的编码方式

          str.getBytes("charset");//指定charset,即将底层存储的Unicode码解析为charset编码格式的字节数组方式

    String new_str=new String(str.getBytes("utf-8"),"gbk"));

         将已经解析出来的字节数据转化为gbk编码格式的字符串,在内存中即为gbk格式的字节数组转为Unicode去交互传递 ,会出现乱码,反过来就不会了

4.

  把String转换成bytes,各种编码转换成的bytes不同,比如UTF-8每个汉字转成3bytes,而GBK转成2bytes,所以要说明编码方式,否则用缺省编码。

  都是将一个string类型的字符串转换成byte类型并且存入一个byte数组中。在java中的所有数据底层都是字节,字节数据可以存入到byte数组。  

  存储字符数据时(字符串就是字符数据),会先进行查表,然后将查询的结果写入设备,读取时也是先查表,把查到的内容打印到显示设备上
  getBytes()是使用默认的字符集进行转换,getBytes(“utf-8”)是使用UTF-8编码表进行转换。

5.在测试过程中,偶尔遇到如下的线程问题

ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [http://www.cnblogs.com/../src/share/back/util.c:820]

解决方法:

在程序最后,main()函数中添加:

System.exit(0);

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

public class testTwo {
    public static void main(String args[]) throws UnsupportedEncodingException{
        int en=0,num=0,space=0,others=0;
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        byte[] bytes=null;
        String a="";
        System.out.println("请输入字符串:");
        try{
            a=br.readLine();
        }catch(IOException e){
            e.printStackTrace();
        }
        bytes=a.getBytes();
        for(int i=0;i<bytes.length;i++){
            char b=(char) bytes[i];

            if(b>=‘a‘&&b<=‘z‘||b>=‘A‘&&b<=‘Z‘){
                en++;
            }else if(b>=‘0‘&&b<=‘9‘){
                num++;
            }else if(b==‘ ‘||b==‘ ‘){
                space++;
            }else if(isChinese(b)){
                others++;
            }
            //String str = String.valueOf(b);
            String c = new String(bytes,"UTF-8");
            System.out.println(i+c);
        }
        if(others>=3){
            others=others/3;
        }
        System.out.println("en is:"+en);
        System.out.println("num is:"+num);
        System.out.println("space is:"+space);
        System.out.println("others is:"+others);
        System.exit(0);
    }
     // 根据Unicode编码完美的判断中文汉字和符号
    private static boolean isChinese(char c) {
        Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
        if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
                || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
                || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
                || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) {
            return true;
        }
        return false;
    }
}
时间: 2024-10-22 01:01:18

java 面试每日一题2的相关文章

java 面试每日一题3

题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字.例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; public class testThree { public static void main

java 面试每日一题

题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半:再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高? import java.util.Scanner; public class testOne { /** * @param args */ private double totalHeight=100; private double curHeight=50; //下落 public void drop(int times){ if((times-1)==0){ re

java面试每日一题8

题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方. 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位. import java.util.Scanner; public class Shuixianhua { public static void main(String[] args){ //

java 面试每日一题6

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class test6 { public static void main

java 面试每日一题4

题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?  1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. public class TestFour { public static void main(String[] args){ int[] array={1,2,3,4}; int i,j,k,num = 0; for(i=0;i<4;i++){ for(j=0;j<4;j++){ if(i==j){ c

java面试每日一题11

题目:求1+2!+3!+...+20!的和 public class Recursion { public static void main(String args[]) throws NumberFormatException, IOException{ System.out.println("请输入一个数"); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); int num1=Integ

JAVA面试/笔试经典题

1.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误.对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译. 2.是否可以从一个static方法内部发出对非s

java面试 - 经典算法题

题目一: public class testClockwiseOutput { //顺时针打印一个矩阵 @Test public void test(){ int[][] num = new int[100][100]; int n = 4; int count =1; for(int i=0;i<n;i++){ for(int j =0;j<n;j++){ num[i][j]=count++; } } output(num,0,n-1); } public void output(int[]

【Java每日一题】20161103

package Nov2016; import java.util.List; public class Ques1103 { public void method01(String[] array){} public void method01(Integer[] array){} public void method02(List<String> list){} public void method02(List<Integer> list){} } 今日问题: 请问主程序能否