Java面试题96-105

2023-12-28 17:08:27

96、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。

答:

首先要了解中文字符有多种编码及各种编码的特征。

????假设n为要截取的字节数。

public static void main(String[] args) throws Exception{

String str = "我a爱中华abc我爱传智def';

String str = "我ABC汉";

int num = trimGBK(str.getBytes("GBK"),5);

System.out.println(str.substring(0,num) );

}

public static int ?trimGBK(byte[] buf,int n){

int num = 0;

boolean bChineseFirstHalf = false;

for(int i=0;i<n;i++)

{

if(buf[i]<0 && !bChineseFirstHalf){

bChineseFirstHalf = true;

}else{

num++;

bChineseFirstHalf = false;

}

}

return num;

}

97、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。

答:哈哈,其实包含中文字符、英文字符、数字字符原来是出题者放的烟雾弹。

String content = 中国aadf的111萨bbb菲的zz萨菲;

HashMap map = new HashMap();

for(int i=0;i<content.length;i++)

{

char c = content.charAt(i);

Integer num = map.get(c);

if(num == null)

num = 1;

else

num = num + 1;

map.put(c,num);

}

for(Map.EntrySet entry : map)

{

system.out.println(entry.getkey() + :?+ entry.getValue());

}

估计是当初面试的那个学员表述不清楚,问题很可能是:

如果一串字符如"aaaabbc中国1512"要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。

int engishCount;

int chineseCount;

int digitCount;

for(int i=0;i<str.length;i++)

{

char ch = str.charAt(i);

if(ch>=0?&& ch<=9)

{

digitCount++

}

else if((ch>=a?&& ch<=z) || (ch>=A?&& ch<=Z))

{

engishCount++;

}

else

{

chineseCount++;

}

}

System.out.println(……………);

98、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序:

1,张三,28

2,李四,35

3,张三,28

4,王五,35

5,张三,28

6,李四,35

7,赵六,28

8,田七,35

程序代码如下(答题要博得用人单位的喜欢,包名用该公司,面试前就提前查好该公司的网址,如果查不到,现场问也是可以的。还要加上实现思路的注释):

package?com.huawei.interview;

import?java.io.BufferedReader;

import?java.io.IOException;

import?java.io.InputStream;

import?java.io.InputStreamReader;

import?java.util.Comparator;

import?java.util.HashMap;

import?java.util.Iterator;

import?java.util.Map;

import?java.util.TreeSet;

public?class?GetNameTest {

/**

?* @param?args

?*/

public?static?void?main(String[] args) {

// TODO?Auto-generated method stub

//InputStream ips = GetNameTest.class.getResourceAsStream("/com/huawei/interview/info.txt");

//用上一行注释的代码和下一行的代码都可以,因为info.txt与GetNameTest类在同一包下面,所以,可以用下面的相对路径形式

Map results = new?HashMap();

InputStream ips = GetNameTest.class.getResourceAsStream("info.txt");

BufferedReader in = new?BufferedReader(new?InputStreamReader(ips));

String line = null;

try?{

while((line=in.readLine())!=null)

{

dealLine(line,results);

}

sortResults(results);

} catch?(IOException e) {

// TODO?Auto-generated catch block

e.printStackTrace();

}

}

static?class?User

{

public??String name;

public?Integer value;

public?User(String name,Integer value)

{

this.name = name;

this.value = value;

}

@Override

public?boolean?equals(Object obj) {

// TODO?Auto-generated method stub

//下面的代码没有执行,说明往treeset中增加数据时,不会使用到equals方法。

boolean?result = super.equals(obj);

System.out.println(result);

return?result;

}

}

private?static?void?sortResults(Map results) {

// TODO?Auto-generated method stub

TreeSet sortedResults = new?TreeSet(

new?Comparator(){

public?int?compare(Object o1, Object o2) {

// TODO?Auto-generated method stub

User user1 = (User)o1;

User user2 = (User)o2;

/*如果compareTo返回结果0,则认为两个对象相等,新的对象不会增加到集合中去

?* 所以,不能直接用下面的代码,否则,那些个数相同的其他姓名就打印不出来。

?* */

//return user1.value-user2.value;

//return user1.value<user2.value?-1:user1.value==user2.value?0:1;

if(user1.value<user2.value)

{

return?-1;

}else?if(user1.value>user2.value)

{

return?1;

}else

{

return?user1.name.compareTo(user2.name);

}

}

}

);

Iterator iterator = results.keySet().iterator();

while(iterator.hasNext())

{

String name = (String)iterator.next();

Integer value = (Integer)results.get(name);

if(value > 1)

{

sortedResults.add(new?User(name,value));

}

}

printResults(sortedResults);

}

private?static?void?printResults(TreeSet sortedResults)

{

Iterator iterator ?= sortedResults.iterator();

while(iterator.hasNext())

{

User user = (User)iterator.next();

System.out.println(user.name + ":" + user.value);

}

}

public?static?void?dealLine(String line,Map map)

{

if(!"".equals(line.trim()))

{

String [] results = line.split(",");

if(results.length == 3)

{

String name = results[1];

Integer value = (Integer)map.get(name);

if(value == null) value = 0;

map.put(name,value + 1);

}

}

}

}

99、排序都有哪几种方法?请列举。用JAVA实现一个快速排序。?

?本人只研究过冒泡排序、选择排序和快速排序,下面是快速排序的代码:

public class QuickSort {
/**
* 快速排序
* @param strDate
* @param left
* @param right
*/
public void quickSort(String[] strDate,int left,int right){
String middle,tempDate;
int i,j;
i=left;
j=right;
middle=strDate[(i+j)/2];
do{
while(strDate[i].compareTo(middle)<0&& i<right)
i++; //找出左边比中间值大的数
while(strDate[j].compareTo(middle)>0&& j>left)
j--; //找出右边比中间值小的数
if(i<=j){ //将左边大的数和右边小的数进行替换
tempDate=strDate[i];
strDate[i]=strDate[j];
strDate[j]=tempDate;
i++;
j--;
}
}while(i<=j); //当两者交错时停止

if(i<right){
quickSort(strDate,i,right);//从
}
if(j>left){
quickSort(strDate,left,j);
}
}
/**
? * @param args
? */
public static void main(String[] args){
String[] strVoid=new String[]{"11","66","22","0","55","22","0","32"};
QuickSort sort=new QuickSort();
sort.quickSort(strVoid,0,strVoid.length-1);
for(int i=0;i<strVoid.length;i++){
System.out.println(strVoid[i]+" ");
}
}


}

100、有数组a[n],用java代码将数组元素顺序颠倒

//用下面的也可以

//for(int i=0,int j=a.length-1;i<j;i++,j--) 是否等效于?for(int i=0;i<a.length/2;i++)

import java.util.Arrays;

public class SwapDemo{

public static void main(String[] args){

int [] a = new int[]{

(int)(Math.random() * 1000),

(int)(Math.random() * 1000),

(int)(Math.random() * 1000),

(int)(Math.random() * 1000),

(int)(Math.random() * 1000)

};

System.out.println(a);

System.out.println(Arrays.toString(a));

swap(a);

System.out.println(Arrays.toString(a));

}

public static void swap(int a[]){

int len = a.length;

for(int i=0;i<len/2;i++){

int tmp = a[i];

a[i] = a[len-1-i];

a[len-1-i] = tmp;

}

}

}

101. 判断第二个日期比第一个日期大

如何用脚本判断用户输入的的字符串是下面的时间格式2004-11-21 必须要保证用户的输入是此格式,并且是时间,比如说月份不大于12等等,另外我需要用户输入两个,并且后一个要比前一个晚,只允许用JAVASCRIPT,请详细帮助作答,,

//这里可用正则表达式判断提前判断一下格式,然后按下提取各时间字段内容

<script type="text/javascript">

window.onload = function()

{

//这么写是为了实现js代码与html代码的分离,当我修改js时,不能影响html代码。

document.getElementById("frm1").onsubmit =

function(){

var d1 = this.d1.value;

var d2 = this.d2.value;

if(!verifyDate?(d1)) {alert("第一个日期格式不对");return false;}

if(!verifyDate?(d2)) {alert("第二个日期格式不对");return false;}

if(!compareDate(d1,d2)) {alert("第二个日期比第一日期小");return false;}

};

}

function compareDate(d1,d2)

{

var arrayD1 = d1.split("-");

var date1 = new Date(arrayD1[0],arrayD1[1],arrayD1[2]);

var arrayD2 = d2.split("-");

var date2 = new Date(arrayD2[0],arrayD2[1],arrayD2[2]);

if(date1 > date2) return false;

return true;

}

function verifyDate(d)

{

var datePattern = /^\d{4}-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2]\d|3[0-1])$/;

return datePattern.test(d);

}

</script>

<form id="frm1" action="xxx.html">

<input type="text" name="d1" />

<input type="text" name="d2" />

<input type="submit"/>

</form>

102.?用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。

<body>

<table id="tbl">

<tr><td>1</td></tr>

<tr><td>2</td></tr>

<tr><td>3</td></tr>

<tr><td>4</td></tr>

<tr><td>5</td></tr>

<tr><td>6</td></tr>

<tr><td>7</td></tr>

<tr><td>8</td></tr>

<tr><td>9</td></tr>

<tr><td>10</td></tr>

</table>

</body>

<script type="text/javascript">

window.οnlοad=function()

{

var tbl = document.getElementById("tbl");

rows = tbl.getElementsByTagName("tr");

for(i=0;i<rows.length;i++)

{

var j = parseInt(i/3);

if(j%2==0) rows[i].style.backgroundColor="#f00";

else ?rows[i].style.backgroundColor="#0f0";

}

}

</script>

103、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交??

<form οnsubmit=return chkForm(this)>

<input type="text"?name="d1"/>

<input type="submit"/>

</form>

<script type=text/javascript?/>

function chkForm(this)

{

var value = thist.d1.value;

var len = value.length;

for(var i=0;i<len;i++)

{

if(value.charAt(i)>"9" || value.charAt(i)<"0")

{

alert("含有非数字字符"); return false;

}

}

return true;

}

</script>

104、HTTP请求的GET与POST方式的区别

答:一般我们在浏览器输入一个网址访问网站都是GET请求;再FORM表单中,可以通过设置Method指定提交方式为GET或者POST提交方式,默认为GET提交方式。

HTTP定义了与服务器交互的不同方法,其中最基本的四种:GET,POST,PUT,DELETE,HEAD,其中GET和HEAD被称为安全方法,因为使用GET和HEAD的HTTP请求不会产生什么动作。不会产生动作意味着GET和HEAD的HTTP请求不会在服务器上产生任何结果。但是安全方法并不是什么动作都不产生,这里的安全方法仅仅指不会修改信息。

根据HTTP规范,POST可能会修改服务器上的资源的请求。比如CSDN的博客,用户提交一篇文章或者一个读者提交评论是通过POST请求来实现的,因为再提交文章或者评论提交后资源(即某个页面)不同了,或者说资源被修改了,这些便是“不安全方法”。

105、解释一下什么是servlet;

答: Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。 它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层

文章来源:https://blog.csdn.net/Syasjy/article/details/135272159
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。