## 力扣389 找不同、力扣1480 一组数组的动态和、## 力扣237删除链表中的节点、## 力扣977 有序数组的平方

力扣389 找不同

注释:java的亦或操作是^= 不能写成
a = a ^ b 要写成 a ^= b
给定两个字符串 s 和 t,它们只包含小写字母。

字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。

示例 1:

输入:s = “abcd”, t = “abcde”
输出:“e”
解释:‘e’ 是那个被添加的字母。
示例 2:

输入:s = “”, t = “y”
输出:“y”
示例 3:

输入:s = “a”, t = “aa”
输出:“a”
示例 4:

输入:s = “ae”, t = “aea”
输出:“a”

方法一:计数
首先遍历字符串 ss,对其中的每个字符都将计数值加 11;然后遍历字符串 tt,对其中的每个字符都将计数值减 11。当发现某个字符计数值为负数时,说明该字符在字符串 tt 中出现的次数大于在字符串 ss 中出现的次数,因此该字符为被添加的字符。

class Solution {
    
    
    public char findTheDifference(String s, String t) {
    
    
        int[] cnt = new int[26];
        for (int i = 0; i < s.length(); ++i) {
    
    
            char ch = s.charAt(i);
            cnt[ch - 'a']++;
        }
        for (int i = 0; i < t.length(); ++i) {
    
    
            char ch = t.charAt(i);
            cnt[ch - 'a']--;
            if (cnt[ch - 'a'] < 0) {
    
    
                return ch;
            }
        }
        return ' ';
    }
}

方法二:求和
将字符串t的ASII码求和,用t-r转为字符类型,即可

class Solution {
    
    
    public char findTheDifference(String s, String t) {
    
    
        int as = 0, at = 0;
        for (int i = 0; i < s.length(); ++i) {
    
    
            as += s.charAt(i);
        }
        for (int i = 0; i < t.length(); ++i) {
    
    
            at += t.charAt(i);
        }
        return (char) (at - as);
    }
}

方法三:位运算
如果将两个字符串拼接成一个字符串,则问题转换成求字符串中出现奇数次的字符。类似于「136. 只出现一次的数字」,我们使用位运算的技巧解决本题。

class Solution {
    
    
    public char findTheDifference(String s, String t) {
    
    
        int ret = 0;
        for (int i = 0; i < s.length(); ++i) {
    
    
            ret ^= s.charAt(i);
        }
        for (int i = 0; i < t.length(); ++i) {
    
    
            ret ^= t.charAt(i);
        }
        return (char) ret;
    }
}


给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。

请返回 nums 的动态和。

力扣1480 一组数组的动态和

示例 1:

输入:nums = [1,2,3,4]
输出:[1,3,6,10]
解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4] 。
示例 2:

输入:nums = [1,1,1,1,1]
输出:[1,2,3,4,5]
解释:动态和计算过程为 [1, 1+1, 1+1+1, 1+1+1+1, 1+1+1+1+1] 。
示例 3:

输入:nums = [3,1,2,10,1]
输出:[3,4,6,16,17]

class Solution {
    
    
    public int[] runningSum(int[] nums) {
    
    
        int length = nums.length;
        int[] sum = new int[length];
        sum[0] = nums[0];
        for(int i=1;i<length;i++){
    
    
            sum[i] = sum[i-1]+nums[i];
        }
        return sum;
    }
}

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。

现有一个链表 – head = [4,5,1,9],它可以表示为:

力扣237删除链表中的节点

示例 1:

输入:head = [4,5,1,9], node = 5
输出:[4,1,9]
解释:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:

输入:head = [4,5,1,9], node = 1
输出:[4,5,9]
解释:给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    
    
    public void deleteNode(ListNode node) {
    
    
        node.val = node.next.val;
        node.next = node.next.next;
    }
}

力扣977 有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:

输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

class Solution {
    
    
    public int[] sortedSquares(int[] nums) {
    
    
        int[] squ = new int[nums.length];
        for(int i=0; i<nums.length; i++){
    
    
            squ[i] = nums[i]*nums[i];
        }
        for (int i = 0; i < squ.length; i++) {
    
    
			for (int j = 0; j < squ.length - i - 1; ++j) {
    
    
				if (squ[j] > squ[j + 1]) {
    
    
					int temp = squ[j];
					squ[j] = squ[j + 1];
					squ[j + 1] = temp;
					//show();
				}
			}
		}
        return squ;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40310710/article/details/112850631