目录
1、LeetCode 125.验证回文串
题目
小编菜解
思路及算法
小菜改进版
大佬指点江山
2、LeetCode 136.只出现一次的数字
题目
小编菜解
大佬指点江山
3、LeetCode 169.多数元素
题目
小编菜解
小编菜解改进版
大佬指点江山
4、关注公众号哪吒编程,回复1024,获取Java学习资料,还有不定期的送书活动
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
public static boolean isPalindrome(String s) {
// 通过正则表达式只获取数字和字母部分
s=s.replaceAll("[^a-zA-Z0-9]","").toLowerCase();
// 回文串是指中间分隔,前面的和后面的revert一样
int length = s.length();
String left = "";
String right = "";
if (length%2 != 0){
left = s.substring(0,length/2);
right = s.substring(length/2+1,length);
right = new StringBuilder(right).reverse().toString();
}else{
int mid = length/2;
left = s.substring(0,mid);
right = s.substring(mid,length);
right = new StringBuilder(right).reverse().toString();
}
return left.equals(right);
}
虽然执行通过了,但效率堪忧啊。
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
所以为什么要中间分隔呢,直接反转,对比反转后的和初始的,不就完事了?菜啊。
public static boolean isPalindrome3(String s) {
// 通过正则表达式只获取数字和字母部分
s=s.replaceAll("[^a-zA-Z0-9]","").toLowerCase();
return s.equals(new StringBuilder(s).reverse().toString());
}
效率依旧很低,因为正则的缘故吧。
public static boolean isPalindrome(String s) {
StringBuilder builder = new StringBuilder();
for (int i = 0;i
差距还是很明显的,能不用正则就不要用正则表达式。
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
/**
* 暴力算法,当前元素与其它元素进行比较,如果有相等的,则表示出现不止一遍,不等,则表示唯一
*/
public static int singleNumber(int[] nums) {
for (int i = 0; i < nums.length; i++) {
boolean flag = true;
for (int j = 0; j < nums.length; j++) {
if (i != j){
if (nums[i] == nums[j]){
flag = false;
break;
}
}
}
if (flag){
return nums[i];
}
}
return 0;
}
参与运算的两个值,如果两个相应bit位相同,则结果为0,否则为1。
public static int singleNumber(int[] nums) {
int single = 0;
for (int num : nums) {
single ^= num;
}
return single;
}
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
public static int majorityElement(int[] nums) {
if (nums.length == 1){
return nums[0];
}
for (int i = 0; i < nums.length; i++) {
int sum = 1;
for (int j = 0; j < nums.length; j++) {
if (i != j){
if (nums[i] == nums[j]){
sum++;
}
}
}
if (sum > nums.length/2){
return nums[i];
}
}
return 0;
}
public static int majorityElement(int[] nums) {
Map map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (!map.containsKey(nums[i])){
map.put(nums[i],1);
}else{
map.put(nums[i],map.get(nums[i]) + 1);
}
}
for (Map.Entry entry : map.entrySet()){
if(entry.getValue() > nums.length/2){
return entry.getKey();
}
}
return 0;
}
执行用时少了不止一点点啊,进步显著,加油。
public static int majorityElement(int[] nums) {
Arrays.sort(nums);
int mid = nums.length/2;
return nums[mid];
}
纳尼?还可以这样玩?思考思考,还真是这样,因为要取得众数,众数一定大于半数,如果排序完之后,这个数组的最中间肯定属于众数,牛逼plus。