题目:给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。
示例:
思路:
1.一个个数据进行移位交换。
2.新创建一个数组。长度和给定的数组相同;将原数组中每个元素都放到新的数组中正确的位置,也就是将原数组中第i个元素放到第i+k个位置;最后把新数组覆盖原数组。
代码:
//方法一:暴力破解
class Solution {
public:
void rotate(vector& nums, int k) {
int temp,previous;
for(int i=0;i& nums, int k) {
int a[nums.size()]={};
for(int i=0;i
题目:颠倒给定的32位无符号整数的二进制位。
示例:
思路:
利用位运算,将结果answer左移一位,空出了最后一位与n最后一位相加,再把answer左移一位,n右移一位;重复循环32次得到结果。
代码:
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t answer=0;
int i=32;
while(i--){
answer=answer<<1;
answer=answer+(n&1);
n=n>>1;
}
return answer;
}
};
题目:
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
示例:
思路:
直接调用betset.count就能计算出来;
右移数组,利用与操作累计出1的个数。
代码:
class Solution {
public:
int hammingWeight(uint32_t n) {
int answer=0;
while(n){
answer+=n&1;
n>>1;
}
return answer;
}
};
//更简单的:
class Solution {
public:
int hammingWeight(uint32_t n) {
bitset<32> b(n);
return b.count();
}
};
题目:
给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个 bash 脚本输出所有有效的电话号码。
你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxxx 或 xxx-xxx-xxxx。(x 表示一个数字)
你也可以假设每行前后没有多余的空格字符。
思路:
这一题考的是bash脚本,过滤电话号码的方法是用正则表达式,可以用grep -P或者awk来实现。具体实现方式也多种多样,这里的答案仅供参考。
代码:
grep -P "^(\d{3}-|\(\d{3}\) )\d{3}-\d{4}$" file.txt
\d{3}代表连续匹配三个数字,|是选择,^是开始的标志,$是结束的标志
题目:
给定一个文本文件 file.txt,请只打印这个文件中的第十行。
思路:
这题可以考虑用sed,awk
代码:
sed -n 10p file.txt
awk NR==10 file.txt
NR代表程序所读的行数
题目:
编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
思路:
利用自连接,将子表中大于主表中的字段都删除;或者直接用子查询先找到最小的各项id,再把不在这个id中的字段删除。
代码:
delete P1
from person P1,person P2
where P1.email=P2.email and P1.id>p2.id
delete from person
where id not in
(
select id from
(
select MIN(id) as id
from person
group by email
)
as temp
)
题目:
给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。
思路:
可以用内连接,利用DATEDIFF确定上一条目录。
代码:
select weather.Id as ID from weather
join weather w on datediff(weather.RecordDate,w.RecordDate)=1
and weather.temperature>w.temperature
题目:
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
思路:
这一题是典型的动态规划问题。假设第一次偷的是第一户,保存在maxval[0];第二次偷的时候就可以比较第一户和第二户的大小,将较大的结果保存在maxval[1];第三次偷的时候再把第三户+maxvasl[0]的金额和maxval[1]比较,选其中更大的。利用for循环遍历这个过程可以得到maxval[n-1]就是我们想要的结果。
代码:
class Solution {
public:
int rob(vector& nums) {
int n = nums.size();
if(n==0)
return 0;
else if(n==1)
return nums[0];
int maxval[n];
maxval[0] = nums[0];
maxval[1] = nums[0] > nums[1] ? nums[0] : nums[1];
for(int i=2;i option2 ? option1 : option2;
}
return maxval[n-1];
}
};
题目:
编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
思路:
1.所有不快乐的数都会进入4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循环中。先给定一个集合初值为1,只要利用一个循环将每次各位数字的平方和添加进这个集合中,同时判断中断循环的条件是数字是否在这个集合中。如果是1就是快乐数。
2.可以用快慢跑的思想,一个每次求和两次,一个求和一次;如果最后两个值相遇,看是否等于1来判断是否是快乐数。
代码:
class Solution {
public:
int SquareNum(int n){
int sum = 0;
while(n>0){
int temp = n % 10;
sum += temp * temp;
n = n / 10;
}
return sum;
}
bool isHappy(int n) {
int slow = n;
int fast = SquareNum(n);
while(slow!=fast){
slow = SquareNum(slow);
fast = SquareNum(fast);
fast = SquareNum(fast);
}
return slow == 1;
}
};
思虑:
简单题,遍历单链表,多余元素删除。
代码:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
if(!head)
return head;
while(head && head->val == val)
head = head->next;
ListNode* temp = head;
while(temp && temp -> next){
if(temp->next->val == val){
temp->next = temp->next->next;
}else{
temp = temp -> next;
}
}
return head;
}
};