今日任务:
力扣数据结构每日一题,学习Java。
一、每日一题
1. 两数之和 - 力扣(LeetCode) (leetcode-cn.com)
思路一
暴力解决,首先,从头开始遍历,再依次往现在这个元素的后面遍历,如果遇到nums[i]+nums[j]==target,就直接返回现在的这两个值在数组中的下标,如此往复,遍历到第一个的值为数组的倒数第二个的地方。但是这样写时间复杂度很大,学会了哈希表后再来优化。
代码实现
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] a=new int[2];
for(int i=0;i<nums.length;i++)
{
for(int j=i+1;j<nums.length;j++)
{
if(nums[i]+nums[j]==target)
{
a[0]=i;//这里我本来是直接返回i,j的,但是不对,然后参考了一下别人的
a[1]=j;
}
}
}
return a;
}
}
过题记录
思路二
哈希表, 借助map来实现,把它的值和下标都存起来,时间复杂度降到O(n)。
代码实现
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> xx;
map<int,int> mp;
for(int i=0;i<nums.size();i++)
{
if(mp.count(nums[i])!=0)
{
xx.push_back(mp[nums[i]]);
xx.push_back(i);
break;
}
mp[target-nums[i]]=i;
}
return xx;
}
};
过题记录
二、Java学习
•逻辑运算符
1.|与||的区别
public class Code1{
public static void main(String[] args){
int aa=5;
int b=10;
if(aa>4|b++>10)//后面的b++得到了执行的机会
System.out.println("aa的值是:"+aa+",b的值是:"+b);
int dd=5;
int ee=10;
if(dd>4||ee++>10)//后面的b++没有得到执行的机会
System.out.println("dd的值是:"+dd+",ee的值是:"+ee);
}
}
不短路或|在得到前一部分为true后,会继续执行后面的。短路或||在得到前一部分为true后,就不再执行后面的部分,直接返回true。
2.&和&&的区别
&会计算前后两个操作数,&&先计算前面部分,如果前面部分是false,则直接返回false,不再计算后面的部分。
•Java流程控制与数组这一部分内容和C语言几乎一模一样,没有做过多的笔记。
•Java中break与continue后面可以跟上一个标签,break就会直接结束标签所在的循环,continue则直接跳过标签所在的循环,重新开始依次循环
•foreach循环,自动遍历数组的每一个元素。但foreach循环相当于一个临时变量,不会改变数组里面的值,因此不要对foreach的循环变量进行赋值。
public class Code1{
public static void main(String[] args){
String[] books={"lixian","lushan","yangyang"};
for(String book : books){//foreach循环
System.out.println(book);
}
}
}