[学习报告]《LeetCode零基础指南》(第五讲) 指针

x33g5p2x  于2021-11-27 转载在 其他  
字(2.8k)|赞(0)|评价(0)|浏览(344)

第一题:1470. 重新排列数组

第二题:1929. 数组串联

第三题:1920. 基于排列构建数组

第四题:1480. 一维数组的动态和

第五题:剑指 Offer 58 - II. 左旋转字符串

第六题:1108. IP 地址无效化

第七题:剑指 Offer 05. 替换空格

字符串替换总结:

第八题:1365. 有多少小于当前数字的数字

第九题:剑指 Offer 17. 打印从1到最大的n位数

第十题:1389. 按既定顺序创建目标数组

第一题:1470. 重新排列数组

  1. class Solution {
  2. public int[] shuffle(int[] nums, int n) {
  3. //只需两个数的步长为n就在一起,在新的数组,因为一次加了两个元素,
  4. //所以每一次下来都得加2
  5. int arr[]=new int[2*n];
  6. for(int i=0,j=0;i<n;i++,j+=2){
  7. arr[j]=nums[i];
  8. arr[j+1]=nums[i+n];
  9. }
  10. return arr;
  11. }
  12. }

 第二题:1929. 数组串联

  1. class Solution {
  2. public int[] getConcatenation(int[] nums) {
  3. //在n和2n分别弄两个索引进行拷贝就可以了
  4. int n=nums.length;
  5. int arr[]=new int [2*n];
  6. int j=0;
  7. for(int i=0;i<2*n;i++){
  8. if(i<n){
  9. arr[i]=nums[i];
  10. }else{
  11. arr[i]=nums[j];
  12. j++;
  13. }
  14. }
  15. return arr;
  16. }
  17. }

 第三题:1920. 基于排列构建数组

这题按照题目的意思就可以了

  1. class Solution {
  2. public int[] buildArray(int[] nums) {
  3. int n= nums.length;
  4. int []arr=new int[n];
  5. for(int i=0;i<n;i++){
  6. arr[i]=nums[nums[i]];
  7. }
  8. return arr;
  9. }
  10. }

 第四题:1480. 一维数组的动态和

第一想法就是创建一个方法实现前几项的和。

  1. class Solution {
  2. public int[] runningSum(int[] nums) {
  3. int count=0;
  4. int n=nums.length;
  5. int arr[]=new int[n];
  6. for(int i=0;i<nums.length;i++){
  7. count=soul(nums,i+1);
  8. arr[i]=count;
  9. }
  10. return arr;
  11. }
  12. public static int soul(int nums[],int n){
  13. int sum=0;
  14. for(int i=0;i<n;i++){
  15. sum+=nums[i];
  16. }
  17. return sum;
  18. }
  19. }

 第五题:剑指 Offer 58 - II. 左旋转字符串

这题参考了一下评论区的想法

  1. class Solution {
  2. public String reverseLeftWords(String s, int n) {
  3. StringBuilder sb=new StringBuilder();
  4. for(int i=n;i<s.length();i++){
  5. sb.append(s.charAt(i));//从n开始得到每个字符
  6. }
  7. for(int i=0;i<n;i++){
  8. sb.append(s.charAt(i));//将第一个到n依次加到之前的后面
  9. }
  10. return sb.toString();//转为字符串后返回
  11. }
  12. }

 第六题:1108. IP 地址无效化

  1. class Solution {
  2. public String defangIPaddr(String address) {
  3. StringBuilder sb=new StringBuilder();
  4. for(int i=0;i<address.length();i++){
  5. if(address.charAt(i) == '.'){//当等于'.'时不加进去,而加"[.]"这样就完成了替换
  6. sb.append("[.]");
  7. continue;
  8. }
  9. sb.append(address.charAt(i));
  10. }
  11. return sb.toString();
  12. }
  13. }

 第七题:剑指 Offer 05. 替换空格

  1. class Solution {
  2. public String replaceSpace(String s) {
  3. StringBuilder sb=new StringBuilder();
  4. for(int i=0;i<s.length();i++){
  5. if(s.charAt(i)==' '){
  6. sb.append("%20");
  7. continue;
  8. }
  9. sb.append(s.charAt(i));
  10. }
  11. return sb.toString();
  12. }
  13. }

 字符串替换总结:

第八题:1365. 有多少小于当前数字的数字

第一想法的老方法

  1. class Solution {
  2. public int[] smallerNumbersThanCurrent(int[] nums) {
  3. int count=0;
  4. int n=nums.length;
  5. int arr[]=new int[n];
  6. for(int i=0;i<n;i++){
  7. count=soul(nums,i);
  8. arr[i]=count;
  9. }
  10. return arr;
  11. }
  12. public static int soul(int nums[],int n){
  13. int sum=0;
  14. for(int i=0;i<nums.length;i++){
  15. if(n!=i){
  16. if(nums[n]>nums[i]){
  17. sum++;
  18. }
  19. }
  20. }
  21. return sum;
  22. }
  23. }

 第九题:剑指 Offer 17. 打印从1到最大的n位数

  1. class Solution {
  2. public int[] printNumbers(int n) {
  3. int number=1;
  4. //几个n就弄到几位数
  5. for(int i=0;i<n;i++){
  6. number*=10;
  7. }
  8. //由题可知申请number-1即可
  9. int []arr=new int[number-1];
  10. for(int i=0,j=1;i<number-1;i++,j++){
  11. arr[i]=j;
  12. }
  13. return arr;
  14. }
  15. }

 第十题:1389. 按既定顺序创建目标数组

  1. class Solution {
  2. public int[] createTargetArray(int[] nums, int[] index) {
  3. //创建一个集合
  4. ArrayList<Integer> array = new ArrayList();
  5. for(int i=0; i<nums.length; i++) {
  6. //通过集合的add方法对指定索引进行插入
  7. array.add(index[i],nums[i]);
  8. }
  9. int[] target = new int[array.size()];
  10. //遍历集合将集合中的元素插入
  11. for(int i=0; i<target.length; i++) {
  12. target[i] = array.get(i);
  13. }
  14. return target;
  15. }
  16. }

相关文章