[LeetCode OJ]Single Number
思路:异或操作,相同的两个数异或得到为0,这样n个数异或的结果是数组里唯一为单的数。
java:
public class Main { public int singleNumber(int[] A) { int sz = A.length; sz--; while (sz > 0) { A[0] ^= A[sz]; sz--; } return A[0]; } public static void main(String[] args) { int[] A = { 1, 2, 1, 2, 4 }; Main obj = new Main(); System.out.println(obj.singleNumber(A)); } }
c++:
#include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <vector> using namespace std; class Solution { public: int singleNumber(int A[], int n) { n --; while(n > 0) { A[0] ^= A[n]; n --; } return A[0]; } }; int main() { Solution obj; int A[] = {1, 2, 1, 2, 4}; printf("%d\n", obj.singleNumber(A, 5)); return 0; }
测试代码的时候,想到几个问题:
1.类定义和声明的区别
2.java main方法里用同一个类里的方法,为什么要new一个对象,C++里可以不用new.
3.c++里对象的创建,new和不new的区别
4.java main方法
1.类定义和声明的区别
int a;是一个整型变量的声明,而int a = 1;就是一个声明再加定义。而char* p;是一个声明,而 p = NULL,就是变量的定义。
class time{};是一个类的声明,因为这样写一般只声明了类里的成员变量(没有初始化的,也不能初始化,除了常量),还有函数的声明。函数声明也就是只有函数名,没有函数体,这个应该了解吧。当然函数声明和定义可以放在一起,一并在clas time{}里面。一般是先声明了函数,再在外面定义函数体,同时也就是类的定义啦。
所以总的说,声明就是告诉编译器有这么一个变量,定义就是告诉编译器这个变量有多大,是干什么用的。
2.java main方法里用同一个类里的方法,为什么要new一个对象,C++里可以不用new
java里不new得话,即只是声明了一个类的引用(有点像指针的意思),所以你不能进行有关类里的操作。必须指向一个实例后才行。而c++里即使不new的话,也创建好对象了,只是不new的话,内存在栈中,new的话在堆中。
例如以下两种情况
1.ArrayList<BookInfo> InfoList=null;
BookInfo bookinfo=null;
bookinfo=test.getinfo();
2.ArrayList<BookInfo> InfoList=new ArrayList<BookInfo>();
BookInfo bookinfo=new BookInfo();
bookinfo=test.getinfo();
区别是:前者,是声明了一个对象(的引用),jvm并没有开辟内存放入一个对象;而后者,在声明了一个对象的引用后,又把新开辟的没有存储任何有效值的对象的地址赋给了他。bookinfo=test.getinfo(),又把它指向了另一个地址 = = 也就是说原来开辟的内存并没有用,那就没有意义。但是java虚拟机自动垃圾回收机制会判断并回收内存的。
java里对象传递的时候,传递的都是引用(也就是对象的地址),这比传递整个对象高效的多。而基础类型,int,double等传递的才是值。比如,(new ArrayList<String>).add(new String("hello")),jvm只是把new String("hello")的地址存入到了列表list里面。String str = new String("Test"),是开辟内存放入了对象,并把它的引用赋给str。。。
3.c++里对象的创建,new和不new的区别
new创建类对象需要指针接收,一处初始化,多处使用
new创建类对象使用完需delete销毁
new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间
new对象指针用途广泛,比如作为函数返回值、函数参数等
频繁调用场合并不适合new,就像new申请和释放内存一样
4.java main方法
在Java中,main()方法是Java应用程序的入口方法,也就是说, 程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数等等。
在看Java中的main()方法之前,先看一个最简单的Java应用程序HelloWorld,我将通过这个例子说明Java类中main()方法的奥秘,程序的代码如下:
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-12-3
* Time: 8:46:50
* Java中的main()方法详解
*/
public class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello World!");
}
}
一、先说类: HelloWorld 类中有main()方法,说明这是个java应用程序,通过JVM直接启动运行的程序。既然是类,java允许类不加public关键字约束,当然类的定义只能限制为public或者无限制关键字(默认的)。
二、再说main()方法 这个main()方法的声明为:public static void main(String args[])。必须这么定义,这是Java的规范。 为什么要这么定义,和JVM的运行有关系。当一个类中有main()方法,执行命令“java 类名”则会启动虚拟机执行该类中的main方法。 由于JVM在运行这个Java应用程序的时候,首先会调用main方法,调用时不实例化这个类的对象,而是通过类名直接调用因此需要是限制为public static。 对于java中的main方法,jvm有限制,不能有返回值,因此返回值类型为void。main方法中还有一个输入参数,类型为String[],这个也是java的规范,main()方法中必须有一个 入参,类细必须String[],至于字符串数组的名字,这个是可以自己设定的,根据习惯,这个字符串数组的名字一般和sun java规范范例中mian参数名保持一致,取名为args。
因此,main()方法定义必须是:“public static void main(String 字符串数组参数名[])”。
三、main()方法不准 throws Exception 因此main()方法中的异常要么处理,要么不处理,不能继续抛出。 比如写个public static int main(String args[]) throws Exception来定义main方法是错误的。
四、main()方法中字符串参数数组作用 main()方法中字符串参数数组作用是接收命令行输入参数的,命令行的参数之间用空格隔开。 下面给出一个例子,看看如何初始化和使用这个数组的。
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-12-3
* Time: 10:22:15
* 打印main方法中的输入参数
*/
public class TestMain {
public static void main(String args[]){
System.out.println("打印main方法中的输入参数!");
for(int i=0;i<args.length;i++){
System.out.println(args[i]);
}
}
}
执行方法和运行结果D:Studybasetestsrc>javac TestMain.java
D:Studybasetestsrc>java TestMain 1 2 3
打印main方法中的输入参数!
1
2
3
五、给出HelloWorld的另外一个版本
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-12-3
* Time: 10:28:58
* 变态版的HelloWorld.呵呵
*/
public class HelloWorld2 {
static {
System.out.println("Hello Wordld!");
}
public static void main(String args[]){
System.exit(0);
}
}
这个main()方法执行的内容就一句"System.exit(0);" ,目的是让程序正常结束。那“HelloWorld!”是从哪里打印的,秘密就是在static打印的,因为static代码块的内容会在main调用前调用。 总结:main方法作为一个特殊的规范,与普通的方法有很大区别,限制很多,理解其原理需要学习JVM相关知识。是Java中学习中大障碍。这是我对main原理和使用的总结,欢迎各位在此讨论。