1.找到一个字符串里面第一个唯一值且区分大小写,并返回其位置;
public static int FirstNotRepeatingChar(String str) {
//LinkedHashMap按照存入的顺序取出,保证顺序
Map<String,Integer> map = new LinkedHashMap();
//将字符串转成字符数组进行 遍历
char[] arr = str.toCharArray();
for(int i=0;i<arr.length;i++){
if(map.containsKey(String.valueOf(arr[i]))){
map.remove(String.valueOf(arr[i]));
}else{
map.put(String.valueOf(arr[i]),i);
}
} //第一个唯一值的索引值 int index = 0; for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); index = entry.getValue(); break; } return index; }
2.
小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为m|S,例如字符串ABCABCABC将会被压缩为[3|ABC],现在小Q的同学收到了小Q发送过来的字符串,你能帮助他进行解压缩么?
对于这道题,我用了大半天,只是根据操作字符串做出了示例中的解压缩,但是只针对包含一个[1],再多我就实在是想不出到底该怎么操作字符串了,网上找到的一个利用正则表达式的方法解决这个问题,特别的简单清晰。
public static void getZip(){
//正则表达式 找出所有的 [|]
String pattern ="\[(\d+)|(\w+)\]";
Pattern pc = Pattern.compile(pattern);
String line = "HG[3|B[2|CA]]F[3|B[2|SA]]";
Matcher m = pc.matcher(line);
while(m.find()){//如果有 [\]这种类型的字符,遍历获取 System.out.println("开始:"+m.group(0));//[2|CA] 第一个这种表达式 int num = Integer.valueOf(m.group(1)); //2 String chs = ""; for(int i=0;i<num;i++){ chs += m.group(2);//CA } //这个是表示用输入的字符串替换第一个 [|] 表达式 line = m.replaceFirst(chs); //然后将这个新的字符串继续执行 //只要有符合的要求他就会继续执行 会一直执行,一直替换,知道全部替换完成为止 m = pc.matcher(line); } }
自己想到的不正确的例子:只能找到含有一个 [|]的例子
// 2|AC [3|B[2|AC]]
public static void getStr(String str,StringBuilder sb){
int index2 = str.indexOf("|");
int num = Integer.valueOf(str.substring(0,index2)); //B
String msg = str.substring(index2+1);
if(msg.contains("[")){ int index = msg.indexOf("["); String ss1 = msg.substring(0,index); //B String conStr=msg.substring(index+1); //2|AC] for(int i3=0;i3<num;i3++){ sb.append(ss1); //BAC getStr(conStr,sb); } }else{//如果真的是2|AC for(int i3=0;i3<num;i3++){ if(msg.contains("]")){ int index = msg.indexOf("]"); msg =msg.substring(0,index); } sb.append(msg); } } } //HG[3|B[2|CA]]F public static String getZip(String str){ StringBuilder sb = new StringBuilder(); if(str.contains("[")){ int index = str.indexOf("["); String s1 = str.substring(0,index); sb.append(s1); String msg = str.substring(index+1); getStr(msg,sb); int index2 = str.lastIndexOf("]"); String end = str.substring(index2+1); sb.append(end); } System.out.println(sb.toString()); return sb.toString(); }
3.java中的参数传递
java中只有值传递,没有引用传递;
自我理解:值传递就是创建一个副本,所以对于基本数据类型,在方法里面改变副本的值,并不会影响到原来的数据;而引用类型的值传递,传递的是引用地址的副本,但是两者相同,指向同一个对象,所以改变对象的值,原对象就是会发生改变;此时如果将副本的地址换成新的对象地址,就不会影响原来的对象了;而引用传递应该就是真实数据或对象的传递,对真实对象进行操作,肯定会改变真实对象的值。
4.为什么重写equals还要重写hashcode?
object里面hashcode计算出来的是本地的方法,返回的是对象的内存地址;equal()方法比较的就是内存地址;而如果对象重写了这两个方法之中的一个,就会造成hashcode()内存地址不同,但是equals()结果相同这种结果显然不正确;而且重写的时候还要注意重写的属性都要对应相同才可以;