2的幂
2的幂
问题陈述
给定一个整数,编写一个函数来判断它是否是 2 的幂次方
代码实现
解法一:
123456789class Solution{ public boolean isPowOfTwo(int n){ if(n==0) return false;//2的幂不会等于0. while(n%2==0){//如果n是2的倍数 n/=2;//不断除2,若是2的幂最后值为1. } return n==1; }}
解法二:
1234//位运算,对n>0 && n&(n-1)==0,则n必为2的幂。class Solution{ return n > 0 && (n & (n - 1)) == 0;}
反转字符串中的单词
反转字符串中的单词
问题陈述
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入: “Let’s take LeetCode contest”
输出: “s’teL ekat edoCteeL tsetnoc”
代码实现
解法一:
12345678public String reverseWords(String s){ String words=s.split(" "); StringBuilder res=new StringBuilder(); for(String word:words){ res.append(new StringBulder(word).reverse().toString()+" "); } return res.toString().trim();}
解法二:
123456789101112131415161718192021222324252627public Str ...
回文数
回文数
问题陈述
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
代码实现
基础解法
12345678910111213141516171819//将数字转为字符串,双指针首位判断。//数字转字符串方法:String.valueOf(x);x.toString();""+x;class Solution { public boolean isPalindrome(int x) { String s=String.valueOf(x); int i=0; int j=s.length()-1; while(i<j){ if(s.charAt(i)!=s.charAt(j)){ return false; }else{ i++; j--; ...
买卖股票的最佳时机
买卖股票的最佳时机
问题陈述(情况1)
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
注意:你不能在买入股票前卖出股票。
思路分析
我们需要找出给定数组中两个数字之间的最大差值(即,最大利润)。此外,第二个数字(卖出价格)必须大于第一个数字(买入价格)。
形式上,对于每组 ii 和 jj(其中 j > ij>i)我们需要找出 \max(prices[j] - prices[i])max(prices[j]−prices[i])。
代码实现
1、暴力法
1234567891011class Solution{ public int maxprofit(int[] price){ int profit=0; for(int i=0;i<price.length-1;i++){ for(int j=i+1;j<price.length;j++){ ...
三角形最小路径和
三角形最小路径和
问题陈述
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。
代码实现
动态规划+自底向上
1234567891011121314class Solution{ public int minimumTotal(List<List<Integer>> triangle){ if(triangle==null||triangle.size()==0) return 0;//判空 int[][] dp=new int[triangle.size()+1][triangle.size()+1];//动态规划 for(int i=triangle.size()-1;i>=0;i--){ List<Integer> rows=triangle.get(i); for ...
验证回文串
验证回文串
问题陈述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
**说明:**本题中,我们将空字符串定义为有效的回文串。
代码实现
123456789101112131415161718class Solution{ public boolean isPalindrome(String s){ if(s==null||s.length()==0) return true; s=s.toLowerCase(); for(int i=0,j=s.length()-1;i<j;i++,j--){//注意多条件for循环表达式写法,冒号只出现两次 while(i<j && !Character.isLetterOrDigit(s.charAt(i))){ i++; } while(i<j && !Charac ...
字符串相乘
字符串相乘
问题陈述
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
思路分析
num1[i] 和 num2[j] 的乘积对应的就是 res[i+j] 和 res[i+j+1] 这两个位置。
代码实现
123456789101112131415161718192021class Solution{ public String multiply(String m,String n){ if(m.equals("0")||n.equals("0")) return "0"; int[] res=new int[m.length()+n.length()];//结果位数为m,n长度之和。 for(int i=m.length()-1;i>=0;i--){ int m1=m.charAt(i)-'0';//某数字字符减0 ...
杨辉三角
杨辉三角
问题陈述
给定一个正整数,输出该杨辉三角的每行。
12345678910输入: 5输出:[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1]]杨辉三角:起始为1;每行开始和末尾都为1;中间的第i个元素等于上一行的第i个元素加上第i-1个元素之和。
代码实现
1234567891011121314151617181920212223class Solution{ public List<List<Integer>> yanghuiTriangle(int rownums){ List<List<Integer>> triangle=new ArrayList<>(); if(rownums==0) return triangle; //添加第一行元素 triangle.add(new ArrayList<>()); triangle.get(0).a ...
填充每个结点的下一个右侧结点指针
填充每个结点的下一个右侧结点指针
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
123456struct Node { int val; Node *left; Node *right; Node *next;}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
代码实现
思路一:
在二叉树层序遍历的基础上,对每一层进行右节点的连结,需判断右节点是否存在。
123456789101112131415161718192021class Solution{ public Node connect(Node root){ if(root==null) return null; Queue<Node> queue=new LinkedList<>(); queue.add(root); ...
最接近的三数之和
最接近的三数之和
问题陈述
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
123输入:nums = [-1,2,1,-4], target = 1输出:2解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
代码实现
12345678910111213141516171819202122class Solution{ public int threeSumClosest(int[] nums,int target){ Arrays.sort(nums); int ans=nums[0]+nums[1]+nums[2]; for(int i=0;i<nums.length;i++){//固定一个数,其他两个分别在首尾运动 int start=i+1,end=nums.length-1; wh ...