移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
class Solution {
public void moveZeroes(int[] nums) {
int n=nums.length,x=0;
for(int i=0;i<n;i++)
{
if(nums[i]!=0)
{
nums[x]=nums[i];
if(x!=i)
nums[i]=0;
x++;
}
}
}
}
个人总结: 设置一个x记录移动位置,遍历数组,当元素不为0时,是需要前移的。将其放入x位置,x后移一位(若前面没有0,则保持原位),将前移前位置改为0(若x==i,不用改,说明前面没有0,不需要移位)
比特位计数
给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。
示例 1:
输入:n = 2
输出:[0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10
示例 2:
输入:n = 5
输出:[0,1,1,2,1,2]
解释:
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101
class Solution {
public int[] countBits(int n) {
int[] a=new int[n+1];
for(int i=0;i<=n;i++)
{
int x=i;
while(x!=0)
{
if(x-x/2*2==1)
a[i]++;
x=x/2;
}
}
return a;
}
}
个人总结: 自己的做法太简单,看了官方题解的动态规划,很有收获。