刷力扣的第一天脑子要长出来的感觉(为什么大四才开始啊啊啊啊啊啊啊啊啊啊啊啊)
emmm,自己还是想不太出来(只是一点想法),可能还是会参考评论区,求各位轻喷
- 分析:带符号一定不是回文,要像个好办法将121,第n-1位和第2位联系起来
- 取余得出后一位。
- %去第n位
- if(n/10==n%10){ true}
- 外面再嵌套一层do while
public boolean isPalindrome(int x) {
if(x<0){
return false;}
int cur = 0;
int num = x;
while(num != 0) {
/*例如:121 第一次 cur=1 num=12
121 第二次 cur=1*10+12%10=12
num=1
第三次 cur=12*10+1
num=0退出循环*/
cur = cur * 10 + num % 10;//将原来的数倒置,
num /= 10;
}
return true;//我的想法,不能通过全部案例,可以改成
/* return cur==x; //倒置结果相等位true,
*/
}
判断到一半就退出
-
罗马数字转整数
- 分析题目,找规律
- 小值在大值左边,减小值
- 小值在大值右边,加小值
/*没想到用switch case来转换字符与数值的关系*/ class Solution { private int getValue(char ch) {//从字符转化成数字 switch(ch) { case 'I': return 1; case 'V': return 5; case 'X': return 10; case 'L': return 50; case 'C': return 100; case 'D': return 500; case 'M': return 1000; default: return 0; } } public int romanToInt(String s) { int sum = 0; int preNum = getValue(s.charAt(0));//获取第一个字符,更具数值的大小判断用-/+法 for(int i = 1;i < s.length(); i ++) { int num = getValue(s.charAt(i)); if(preNum < num) { sum -= preNum; } else { sum += preNum; } preNum = num; } sum += preNum; return sum; } }
- 提交的版本
class Solution { public int romanToInt(String s) { int sum=0;//用于记录得出的值 int first=getValue(s.charAt(0));//s.char()获取字符,调用方法或得数值 /*for来读取有几个数值,并比较左值和右值的大小来判断用-/+ */ for(int i = 1;i < s.length(); i ++) { int num = getValue(s.charAt(i));//获取后面的数值 if(first < num) {//first不一定就是第一个值啦 sum -= first; } else { sum += first; } first = num; } sum += first; return sum; } private int getValue(char ch) { switch(ch) { case 'I': return 1; case 'V': return 5; case 'X': return 10; case 'L': return 50; case 'C': return 100; case 'D': return 500; case 'M': return 1000; default: return 0; } } }
-
最长前缀(王道数据结构中有类似题目)
- c++将字符串分解成一个一个字符,使用两个指针,同时从第一个空间开始便利,对比两个空间里的字符是不是一样的。
- java:找个最短的字符,读取长度,在长度内和另一个字符一一比较,不同就跳出,并记录个数,好输出
/*我的,不能通过所以的案例*/
class Solution {
public String longestCommonPrefix(String[] strs) {
/*如果有空字符,就没有共同前缀 */
if(strs.length == 0)
return " ";
/*用一个字符串来比较 */
String a = strs[0];
/**for循环来一次比较,并在跳出前记录以及比较过的字符串 */
for(int i =1;i<strs.length;i++) {
int j=0;
for(;j<a.length() && j < strs[i].length();j++) {
if(a.charAt(j) != strs[i].charAt(j))
{
break;
}
}
a = a.substring(0, j);//j用来记录相同的字符个数,
if(a.equals("")){
return " ";//删除空格就可以通过所有的了
}
}return a;//输出字符
}
}
-
有效括号(王道)
/*switch case case里面用ifelse,但是代码量比较大,要长脑子 了么*/ class Solution { public boolean isValid(String s) { int n=s.length(); if(n%2!=0) return false;//入一半的栈 int[] stack; stack=new int[n]; int top=-1; for(int i=0;i<n;i++){ int c = s.charAt(i); if(c=='('||c=='{'||c=='['){ stack[++top]=c; }//只有左边可以入栈 else{ if(top!=-1){ switch(c){ case ')': if (stack[top]!='(') return false; break; case '}': if (stack[top]!='{') return false; break; case ']': if (stack[top]!='[') return false; break; } top--; } else return false;//右半边不能入栈 } } if(top!=-1) return false; return true; } } /*用栈,进出栈来比较左右括号*/
-
合并链表(王道)
/*链表的比较,以及语法还是要再加强一下,好不容易会一个,因为链表.的使用方法纠结好久,给了结构体,所以用.val和.next来移动指针和取值
public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1 == null) {
return list2;
}
if(list2 == null) {
return list1;
}
if(list1.val < list2.val) {
list1.next = mergeTwoLists(list1.next, list2);
return list1;
} else {
list2.next = mergeTwoLists(list1, list2.next);
return list2;
}
}
}
- 删除重复项(王道有)我是菜菜,没做出来
int length = nums.length;
if (length <= 1) {
return length;
}
int j = 0;
/*j作为一个哨兵,用于记录删除后后续应填入数的位置*/
for (int i = 0; i < length; i++) {
if (nums[i] != nums[j]) {
nums[++j] = nums[i];//重点,相等时j不变,不移动,等不等时,移动指针,放入nums[i]的值
}
}
return j+1;
/*在26的基础上改编*/
class Solution {
public int removeElement(int[] nums, int val) {
int length = nums.length;
if (length < 1) {
return length;
}
/*不加的话,会有一个例子不过*/
if(length==1){
if(nums[0]==val)
{return 0;}
}
int j = 0;
/*j作为一个哨兵,用于记录删除后后续应填入数的位置*/
for (int i = 0; i < length; i++) {
if (nums[i]!=val) {
nums[j++] = nums[i];//重点,相等时j不变,不移动,等不等时,移动指针,放入nums[i]的值
}
}
return j;
}
}
-
/*呦吼,完全自己写的没有参考哦,脑子开始长了*/ class Solution { public int searchInsert(int[] nums, int target) { int j=0; for(int i=0;i<nums.length;i++){ if(nums[i]<=target){ if(nums[i]<target) {j++;}else{ break; } }else{ break; } }return j; } }