目录
第一题:1470. 重新排列数组
第二题:1929. 数组串联
第三题:1920. 基于排列构建数组
第四题:1480. 一维数组的动态和
第五题:剑指 Offer 58 - II. 左旋转字符串
第六题:1108. IP 地址无效化
第七题:剑指 Offer 05. 替换空格
字符串替换总结:
第八题:1365. 有多少小于当前数字的数字
第九题:剑指 Offer 17. 打印从1到最大的n位数
第十题:1389. 按既定顺序创建目标数组
第一题:1470. 重新排列数组
class Solution {
public int[] shuffle(int[] nums, int n) {
//只需两个数的步长为n就在一起,在新的数组,因为一次加了两个元素,
//所以每一次下来都得加2
int arr[]=new int[2*n];
for(int i=0,j=0;i<n;i++,j+=2){
arr[j]=nums[i];
arr[j+1]=nums[i+n];
}
return arr;
}
}
第二题:1929. 数组串联
class Solution {
public int[] getConcatenation(int[] nums) {
//在n和2n分别弄两个索引进行拷贝就可以了
int n=nums.length;
int arr[]=new int [2*n];
int j=0;
for(int i=0;i<2*n;i++){
if(i<n){
arr[i]=nums[i];
}else{
arr[i]=nums[j];
j++;
}
}
return arr;
}
}
第三题:1920. 基于排列构建数组
这题按照题目的意思就可以了
class Solution {
public int[] buildArray(int[] nums) {
int n= nums.length;
int []arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=nums[nums[i]];
}
return arr;
}
}
第四题:1480. 一维数组的动态和
第一想法就是创建一个方法实现前几项的和。
class Solution {
public int[] runningSum(int[] nums) {
int count=0;
int n=nums.length;
int arr[]=new int[n];
for(int i=0;i<nums.length;i++){
count=soul(nums,i+1);
arr[i]=count;
}
return arr;
}
public static int soul(int nums[],int n){
int sum=0;
for(int i=0;i<n;i++){
sum+=nums[i];
}
return sum;
}
}
第五题:剑指 Offer 58 - II. 左旋转字符串
这题参考了一下评论区的想法
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuilder sb=new StringBuilder();
for(int i=n;i<s.length();i++){
sb.append(s.charAt(i));//从n开始得到每个字符
}
for(int i=0;i<n;i++){
sb.append(s.charAt(i));//将第一个到n依次加到之前的后面
}
return sb.toString();//转为字符串后返回
}
}
第六题:1108. IP 地址无效化
class Solution {
public String defangIPaddr(String address) {
StringBuilder sb=new StringBuilder();
for(int i=0;i<address.length();i++){
if(address.charAt(i) == '.'){//当等于'.'时不加进去,而加"[.]"这样就完成了替换
sb.append("[.]");
continue;
}
sb.append(address.charAt(i));
}
return sb.toString();
}
}
第七题:剑指 Offer 05. 替换空格
class Solution {
public String replaceSpace(String s) {
StringBuilder sb=new StringBuilder();
for(int i=0;i<s.length();i++){
if(s.charAt(i)==' '){
sb.append("%20");
continue;
}
sb.append(s.charAt(i));
}
return sb.toString();
}
}
字符串替换总结:
这种字符串替换的问题,其实一个思路,先创建StringBuilder类,在一个for循环中通过
s.charAt(i)得到s字符串中的每个字符,在通过比对要换的字符,比对成就加入替换的字符
在通过此次字符暂停(continue),StingBuilder对象.append(s.charAt(i))即可.最后通过
toSting()返回即可.
第八题:1365. 有多少小于当前数字的数字
第一想法的老方法
class Solution {
public int[] smallerNumbersThanCurrent(int[] nums) {
int count=0;
int n=nums.length;
int arr[]=new int[n];
for(int i=0;i<n;i++){
count=soul(nums,i);
arr[i]=count;
}
return arr;
}
public static int soul(int nums[],int n){
int sum=0;
for(int i=0;i<nums.length;i++){
if(n!=i){
if(nums[n]>nums[i]){
sum++;
}
}
}
return sum;
}
}
第九题:剑指 Offer 17. 打印从1到最大的n位数
class Solution {
public int[] printNumbers(int n) {
int number=1;
//几个n就弄到几位数
for(int i=0;i<n;i++){
number*=10;
}
//由题可知申请number-1即可
int []arr=new int[number-1];
for(int i=0,j=1;i<number-1;i++,j++){
arr[i]=j;
}
return arr;
}
}
第十题:1389. 按既定顺序创建目标数组
class Solution {
public int[] createTargetArray(int[] nums, int[] index) {
//创建一个集合
ArrayList<Integer> array = new ArrayList();
for(int i=0; i<nums.length; i++) {
//通过集合的add方法对指定索引进行插入
array.add(index[i],nums[i]);
}
int[] target = new int[array.size()];
//遍历集合将集合中的元素插入
for(int i=0; i<target.length; i++) {
target[i] = array.get(i);
}
return target;
}
}
这个参考了评论区的想法,非常的巧妙,利用add带索引的插入方法,在通过遍历加入所有
元素,确实挺好的。