C/C++每日一练(20230325)

简介: C/C++每日一练(20230325)

1. 搜索插入位置


给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。


你可以假设数组中无重复元素。


示例 1:

输入: [1,3,5,6], 5

输出: 2


示例 2:

输入: [1,3,5,6], 2

输出: 1


示例 3:

输入: [1,3,5,6], 7

输出: 4


示例 4:

输入: [1,3,5,6], 0

输出: 0


代码:

#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    int searchInsert(vector<int> &nums, int target)
    {
        int lo = -1;
        int hi = nums.size();
        while (lo + 1 < hi)
        {
            int mid = lo + (hi - lo) / 2;
            if (target > nums[mid])
            {
                lo = mid;
            }
            else
            {
                hi = mid;
            }
        }
        return hi;
    }
};
int main()
{
  Solution s;
  vector<int> nums = {1,3,5,6};
  cout << s.searchInsert(nums, 5) << endl;
  cout << s.searchInsert(nums, 2) << endl;
  cout << s.searchInsert(nums, 7) << endl;
  cout << s.searchInsert(nums, 0) << endl;
  return 0;
} 

输出:

2

1

4

0

二分查找,其它写法:

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left = 0, right = nums.size() - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return left;
    }
};



完整代码:

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left = 0, right = nums.size() - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return left;
    }
};
int main()
{
  Solution s;
  vector<int> nums = {1,3,5,6};
  cout << s.searchInsert(nums, 5) << endl;
  cout << s.searchInsert(nums, 2) << endl;
  cout << s.searchInsert(nums, 7) << endl;
  cout << s.searchInsert(nums, 0) << endl;
  return 0;
} 




2. 结合两个字符串


写一个结合两个字符串的方法,从第一个字符串中取出一个字符,然后从第二个字符串中取出一个字符,以此类推。一旦一个字符串没有字符,它就应该继续使用另一个字符串


输入:两个字符串,如s1="day"和s2="time"

输出:一个结果字符串,对于上面的输入情况,它将是“dtaiyme”。

出处:

https://edu.csdn.net/practice/23719159

代码:

#include <iostream>
#include <string>
using namespace std;
string StrCon(const string& a, const string& b)
{
    string c;
    int n = a.size(), m = b.size();
    if (0 == n)    return a;
    if (0 == m) return b;
    int i, j;
    for (i = 0, j = 0; i < n && j < m; ++i, ++j)
    {
        c += a[i];
        c += b[i];
    }
  while (i < n)
      c += a[i++];
  while (j < m)
      c += b[j++];
      return c;
}
int main()
{
    string s = "day", t = "time";
    cout << StrCon(s, t) << endl;
    system("pause");
    return 0;
}



输出:

dtaiyme


3. 同构字符串


给定两个字符串 s 和 t,判断它们是否是同构的。

如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

示例 1:

输入:s = "egg", t = "add"

输出:true


示例 2:

输入:s = "foo", t = "bar"

输出:false


示例 3:

输入:s = "paper", t = "title"

输出:true


提示:

   可以假设 s 和 t 长度相同。


出处:

https://edu.csdn.net/practice/23719160

代码:

#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    bool isIsomorphic(string s, string t)
    {
        vector<int> m(128, -1);
        for (int i = 0; i < s.size(); ++i)
        {
            if (m[s[i]] != -1)
            {
                if (m[s[i]] != t[i])
                    return false;
            }
            else
            {
                for (auto v : m)
                {
                    if (v == t[i])
                        return false;
                }
                m[s[i]] = t[i];
            }
        }
        return true;
    }
};
int main()
{
  Solution sol;
    string s = "egg", t = "add";
    cout << (sol.isIsomorphic(s, t) ? "true" : "false") << endl;
    s = "foo", t = "bar";
    cout << (sol.isIsomorphic(s, t) ? "true" : "false") << endl;
    s = "paper", t = "title";
    cout << (sol.isIsomorphic(s, t) ? "true" : "false") << endl;
    return 0;
}





输出:

true

false

true








目录
相关文章
|
6月前
|
Linux 监控 Ubuntu
Linux 终端操作命令(1)
Linux 终端操作命令(1)
98 1
Linux 终端操作命令(1)
|
6月前
|
算法 Java Go
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
47 1
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
|
6月前
|
Linux 监控 Shell
Linux 终端命令之文件浏览(4) head, tail
Linux 终端命令之文件浏览(4) head, tail
61 0
Linux 终端命令之文件浏览(4) head, tail
|
6月前
|
Shell Linux 机器学习/深度学习
Linux 终端操作命令(3)内部命令用法
Linux 终端操作命令(3)内部命令用法
90 0
Linux 终端操作命令(3)内部命令用法
|
6月前
|
Python Linux Ubuntu
Linux系统部署Python语言开发运行环境
Linux系统部署Python语言开发运行环境
220 0
Linux系统部署Python语言开发运行环境
|
6月前
|
Go Unix 开发者
Go语言time库,时间和日期相关的操作方法
Go语言time库,时间和日期相关的操作方法
102 0
Go语言time库,时间和日期相关的操作方法
|
6月前
|
C++ 存储 Serverless
力扣C++|一题多解之数学题专场(2)
力扣C++|一题多解之数学题专场(2)
50 0
力扣C++|一题多解之数学题专场(2)
|
6月前
|
Go 机器学习/深度学习 Rust
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
87 0
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
|
6月前
|
Java Go C++
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列
64 0
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列
|
6月前
|
Java Go C++
Golang每日一练(leetDay0111) 摆动排序II\I Wiggle Sort
Golang每日一练(leetDay0111) 摆动排序II\I Wiggle Sort
57 0
Golang每日一练(leetDay0111) 摆动排序II\I Wiggle Sort