Thursday, August 29, 2013

1.3------- check if one string is the permutation of the other

Q:
 Given two strings, write a method to decide if one is a permutation of the other.

A:

public static boolean isPermutation(String str1, String str2){

    if (str1 == null && str2 == null)return true;         //both are not nulll

    else if (str1 == null || str2 == null)                       // only one is null

        return false;

    else{                                                                // both are not null ,  maybe of length 0

        if(str1.length()!= str2.length())

            return false;

        // Now they are of the same length, and

        char[] arr = str1.toCharArray();

        Arrays.sort(arr);

        str1 = new String(arr);

       

        arr = str2.toCharArray();

        Arrays.sort(arr);

        str2 = new String(arr);

        if(str1.equals(str2))    return true;

        else                return false;

    }

}




Mistakes
1: java里面, 没有elseif 语句, 只有 else if
2:   没有清楚, Arrays.sort(arr); 返回是void,  而所谓的排序,就是在arr里直接操作了。
    另外, 要import java.util.Arrays; 
 
3: 书上说“    in your interview, you should always check with your interviewer about the size of the character set."
4:   另外一个方法,就是  ”check if the two strings have identical character counts.

学到的


 可以看这里 java传值还是传引用
 
参见
http://www.javaresearch.org/article/3156.htm
1、对象是按引用传递的
2、Java 应用程序有且仅有的一种参数传递机制,即按值传递
3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本
4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本
写的没错,但是文字太多,第二条就已经把人弄糊涂了,得仔细看完4条才清楚。而且对String类型的疑惑没有解决。

这么简单的事情,何必这么绕呢?为啥没人跟c++过不去,偏要跟Java来劲?
三句话总结一下:
1.对象就是传引用
2.原始类型就是传值
3.String等immutable类型因为没有提供自身修改的函数,每次操作都是新生成一个对象,所以要特殊对待。可以认为是传值。
对于,String类型 ,可以看这里
说完了java的String类型,我们最后看看java函数参数的传递,到底是值传递还是引用传递呢?一般的说法是对于基本类型比如int、char是值传递,对于对象类型是引用传递。这种说法没错,但是请看下面的例子:
String s=”abc”;
change(s);
System.out.println(s);
public void change(String str)
{
     str=”abcd”;
}
上面的程序会有什么结果呢?打印abc还是abcd,运行程序会发现打印的是abc,完了,似乎不合乎常理,按理说String 也是对象,应该是引用传递才对啊,有的同学知道java的String类型是不可变类型,会得出结果abc,具体解释是String就相当于是char[]的包装类。包装类的特质之一就是在对其值进行操作时会体现出其对应的基本类型的性质。在参数传递时,包装类就是如此体现的。所以,对于String在这种情况下的展现结果的解释就自然而然得出了。同样的,Integer、Float等这些包装类和String在这种情况下的表现是相同的。下面从函数参数传递的方式来理解也可以得出相同的结果。
java的参数传递本质上都可以认为是值传递,对基本类型自然不必说,对于对象类型,传递的是对象的地址,地址是个数字,也是基本类型,所以也还是值传递的, 有了这个基础,上面的题目可以这样理解,s是字符串abc的地址,调用change方法时,把s的拷贝赋给str,即str也指向abc,但是在方法里又把str指向abcd,str就是abcd的地址了,但是s还是指向的abc。

No comments:

Post a Comment